Code mówi więcej:Funkcja lambda nie zamyka parametru w Pythonie?
from pprint import pprint
li = []
for i in range(5):
li.append(lambda : pprint(i))
for k in li:
k()
wydajność:
4 4 4 4 4
dlaczego nie
0 1 2 3 4
??
Dzięki.
P.S. Jeśli piszę kompletny dekorator, że działa zgodnie z oczekiwaniami:
from pprint import pprint
li = []
#for i in range(5):
#li.append(lambda : pprint(i))
def closure(i):
def _func():
pprint(i)
return _func
for i in range(5):
li.append(closure(i))
for k in li:
k()
zobacz [to pytanie] (http://stackoverflow.com/q/2295290/195823) i [moja odpowiedź na to pytanie] (http://stackoverflow.com/questions/2295290/what-do-lambda- function-closures-capture-in-python/2295372 # 2295372) –
Możesz zobaczyć, że to zamyka zmienną, przenosząc oryginalną pętlę do funkcji, a następnie wywołując funkcję przed linią 'for k in li:', więc że 'i' nie jest poprawną nazwą w zakresie poziomu modułu. Będzie nadal działać (i uzyskać ten sam wynik, ponieważ zamyka odwołanie, a nie wartość), co oznacza, że nazwa jest zamknięta. – agf
Dziękuję wszystkim.Myślę, że http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python/2295368#2295368 mówi nie tylko o rozwiązaniu, ale także o tym, dlaczego. Myślę, że moje pytanie jest duplikatem http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python – Grissiom