Python lambda est contraignant pour les valeurs locales

Le code suivant crache 1 deux fois, je m'attends à voir 0 et puis 1

def pv(v) :
  print v


def test() :
  value = []
  value.append(0)
  value.append(1)
  x=[]
  for v in value :
    x.append(lambda : pv(v))
  return x

x = test()
for xx in x:
  xx()

Je m'attendais python lambdas à se lier à la référence à une variable locale est pointant vers, derrière la scène. Cependant cela ne semble pas être le cas. J'ai enountered ce problème dans un système où le lambda est de faire C++moderne's equavalent d'un bind ('boost::bind par exemple), où dans de tels cas, vous devez le lier à un smart ptr ou copie contstruct une copie pour le lambda.

Alors, comment puis-je lier une variable locale à une fonction lambda et ont de conserver la référence correcte lorsque utilisé? Je suis assez sur le cul avec le comportement car je ne voudrais pas que cela à partir d'une langue avec un garbage collector.

Le code en question se présente comme suit (l3_e est la variable qui est à l'origine du problème) :

 for category in cat :
      for l2 in cat[category].entries :
        for l3 in cat[category].entries[l2].entry["sub_entries"] :
          l3_e = cat[category].entries[l2].entry["sub_entries"][l3]
          url = "http://forums.heroesofnewerth.com/" + l3_e.entry["url"]
          self.l4_processing_status[l3_e] = 0
          l3_discovery_requests.append( Request(
            url, callback = lambda response : self.parse_l4(response,l3_e)))
          print l3_e.entry["url"]
    return l3_discovery_requests
J'ai vu plusieurs variantes de cette question. quelqu'un a besoin de regrouper tous d'entre eux, de changer le titre pour quelque chose de mémorable, et puis dire à l'internet à google que
ah, ici, vous allez, près de dupliquer: lexicale-fermetures-en-python
Aussi, le premier morceau de code pour illustrer votre point parfaitement, pourquoi coller dans ce second morceau?
oui , je n'arrivais pas à l'exprimer correctement, j'ai essayé de reproduire la façon lua œuvres.
La partie étrange de Python, c'est que les variables de boucle persistent après la boucle, de sorte que les fonctions définies à l'intérieur de la boucle et le référencement de la variable de boucle, ne pas jeter un NameError si elle est appelée hors de la boucle. Dans la plupart des autres langues, les variables de boucle ne sont accessibles qu'à l'intérieur de la boucle elle-même.

OriginalL'auteur Hassan Syed | 2012-05-04