Der folgende Code 1
zweimal ausspuckt, erwarte ich 0
zu sehen und dann 1
Lambda-Python zu lokalen Werten Bindung
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()
Ich erwartete Python Lambdas auf die Referenz binden eine lokale Variable zeigt, hinter der Szene. Dies scheint jedoch nicht der Fall zu sein. Ich habe dieses Problem in einem großen System entdeckt, wo das Lambda dem modernen C++ gleichwertig ist mit einer Bindung (zum Beispiel boost :: bind), wo Sie in einem solchen Fall an ein smart ptr binden oder eine Kopie für das Lambda kopieren würden.
Also, wie binde ich eine lokale Variable an eine Lambda-Funktion und habe sie die richtige Referenz beibehalten, wenn sie verwendet wird? Ich bin ziemlich betrunken mit dem Verhalten, da ich dies nicht von einer Sprache mit einem Müllsammler erwarten würde.
Der betreffende Code sieht wie folgt aus (l3_e die Variable, die das Problem verursacht):
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
Ich habe mehrere Varianten dieser Frage gesehen. jemand muss alle von ihnen aggregieren, den Titel in etwas denkwürdiges ändern, und dann dem Internet sagen, googeln, dass – Shep
ah, hier gehen Sie, in der Nähe von Duplikat: [lexical-closures-in-python] (http://stackoverflow.com/q/233673/915501) – Shep
Auch der erste Code-Chunk veranschaulicht Ihren Punkt perfekt, warum einfügen in diesem zweiten Brocken? – Shep