Die Bindung von Python Lambda an lokale Werte

Der folgende Code spuckt aus1 zweimal erwarte ich zu sehen0 und dann1

<code>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()
</code>

Ich habe erwartet, dass Python-Lambdas sich hinter den Kulissen an die Referenz binden, auf die eine lokale Variable zeigt. Dies scheint jedoch nicht der Fall zu sein. Ich bin auf dieses Problem in einem großen System gestoßen, in dem das Lambda das Äquivalent eines Binds in modernem C ++ ausführt (z. B. 'boost :: bind'), in dem Sie in einem solchen Fall an einen intelligenten ptr binden oder eine Kopie für das Lambda konstruieren.

Wie binde ich also eine lokale Variable an eine Lambda-Funktion und lasse sie bei Verwendung die richtige Referenz beibehalten? Ich bin ziemlich begeistert von dem Verhalten, da ich dies von einer Sprache mit einem Müllsammler nicht erwarten würde.

Der fragliche Code sieht folgendermaßen aus (l3_e ist die Variable, die das Problem verursacht):

<code> 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
</code>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage