Następujący kod wypluwa 1
dwa, że spodziewać się 0
i 1
Pythona lambda wiązania do lokalnych wartości
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()
że oczekuje lambdy Pythonowi wiązać się z odniesieniem zmienna lokalnego wskazując, za scena. Jednak wydaje się, że tak nie jest. Rozwinąłem ten problem w dużym systemie, w którym lambda wykonuje współczesną równoważność C++ wiązania (na przykład "boost :: bind"), w którym w takim przypadku wiązałbyś się z inteligentnym ptr lub kopią, kontrukując kopię dla lambda.
Jak powiązać zmienną lokalną z funkcją lambda i czy zachowuje poprawne odniesienie, gdy jest używana? Jestem dość oszołomiony tym zachowaniem, ponieważ nie spodziewałbym się tego po języku z śmieciarzem.
Kod w pytaniu wygląda następująco (l3_e jest zmienną, która jest przyczyną problemu):
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
Widziałem kilka wariantów tego pytania. ktoś musi zebrać je wszystkie, zmienić tytuł na coś niezapomnianego, a następnie powiedzieć internetowi, żeby google to – Shep
ah, tutaj idziesz, w pobliżu duplikatu: [leksykalny-zamknij-w-python] (http://stackoverflow.com/q/233673/915501) – Shep
Również pierwszy fragment kodu doskonale ilustruje twój punkt, dlaczego wklejasz ten drugi fragment? – Shep