Récemment, j'ai commencé à jouer avec Python et je suis autour de quelque chose de particulier dans la façon dont les fermetures de travail. Considérons le code suivant:
adders= [0,1,2,3]
for i in [0,1,2,3]:
adders[i]=lambda a: i+a
print adders[1](3)
Il construit un tableau simple de fonctions que de prendre une seule entrée et de retour que l'entrée ajoutée par un nombre. Les fonctions sont construits en boucle où l'itérateur i va de 0 à 3. Pour chacun de ces numéro un lambda d'une fonction est créée, qui recueille des je et ajoute à l'entrée de la fonction. La dernière ligne appelle la deuxième fonction lambda avec 3 en tant que paramètre. À ma grande surprise, la sortie a été:
6
Je m'attendais à un 4. Mon raisonnement était: en Python, tout est objet et ainsi, chaque variable est essentiel qu'un pointeur vers elle. Lors de la création du lambda des fermetures pour - je, je m'attendais à stocker un pointeur vers l'objet integer actuellement pointée par je. Cela signifie que, quand j'ai assigné un nouvel objet integer il ne faut pas en effet le bouclage. Malheureusement, l'inspection de l'additionneurs tableau à l'intérieur d'un débogueur montre qu'il n'. Tous les lambda fonctions, reportez-vous à la dernière valeur de i, 3, ce qui entraîne adders1 retour 6.
Ce qui m'a le suivant:
- ce qui ne les fermetures de saisir exactement?
- Quelle est la façon la plus élégante de convaincre que les lambda fonctions de capture de la valeur actuelle de i et d'une manière qui ne sera pas affectée lorsque je change la valeur.