代碼會談更多:lambda函數不要在Python中關閉參數?
from pprint import pprint
li = []
for i in range(5):
li.append(lambda : pprint(i))
for k in li:
k()
產量:
4 4 4 4 4
爲什麼不
0 1 2 3 4
?
謝謝。
P.S.如果我寫了完整的裝飾,它按預期工作:
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()
請參閱[此問題](http://stackoverflow.com/q/2295290/195823)和[我對此問題的回答](http://stackoverflow.com/questions/2295290/what-do-lambda-函數閉包捕獲在python/2295372#2295372) –
你可以看到,通過將原始循環移動到一個函數,然後在'for k in li:'行之前調用函數來關閉變量,所以'i'不是模塊級範圍中的有效名稱。它仍然可以工作(並且得到相同的結果,因爲它關閉了一個引用而不是值),這意味着該名稱已關閉。 – agf
謝謝大家。我認爲http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python/2295368#2295368不僅告訴解決方案,但也是爲什麼。我認爲我的問題是重複與http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python – Grissiom