2012-12-19 1 views
-1

Possible en double:
Creating lambda inside a loopComment obtenir une fermeture pour se référer à la valeur qu'une variable avait au moment de sa définition

Dans le code ci-dessous, en invoquant un membre de le tableau retourné des fermetures imprime le numéro 4.

def go(): 
    x = [] 
    for i in range(5): 
     def y(): print i 
     x.append(y) 

    return x 

Je voudrais li ke chaque membre de la fermeture pour imprimer le numéro i était lorsque la fermeture a été définie.

Répondre

4

Une façon de contourner cela est d'utiliser des arguments par défaut:

def y(i=i): 
    print i 

arguments par défaut sont évalués lorsque la fonction est créée, pas appelé, donc cela fonctionne comme on pouvait s'y attendre.

>>> i = 1 
>>> def y(i=i): print i 
... 
>>> i = 2 
>>> y() 
1 

Un peu plus d 'info juste pour le plaisir:

Si vous êtes curieux de ce que les valeurs par défaut, vous pouvez toujours vérifier que l'attribut .func_defaults (__defaults__ dans python3.x):

>>> y.func_defaults 
(1,) 

Cet attribut est également accessible en écriture, de sorte que vous pouvez en fait modifier les valeurs par défaut après la création de la fonction en y ajoutant un nouveau tuple.

Questions connexes