3 回答

TA貢獻1864條經驗 獲得超6個贊
我猜想您在列表推導中創建的lambda綁定到變量i,最終變量i最終為5。因此,當您在事后求值時,lambda全部綁定為5并最終計算25.在第二個示例中,num也發生了同樣的事情。當您評估循環內的lambda時,num的值沒有改變,因此您獲得了正確的值。循環后,num為5 ...
我不太確定您要做什么,所以不確定如何提出解決方案。這個怎么樣?
def square(x): return lambda : x*x
listOfLambdas = [square(i) for i in [1,2,3,4,5]]
for f in listOfLambdas: print f()
這給了我預期的輸出:
1
4
9
16
25
另一種思考方式是,lambda在創建時就“捕獲”其詞法環境。因此,如果您給它num,它直到被調用時才真正解析該值。這既混亂又強大。

TA貢獻1712條經驗 獲得超3個贊
你有:
listOfLambdas = [lambda: i*i for i in range(6)]
for f in listOfLambdas:
print f()
輸出:
25
25
25
25
25
25
您需要粗魯!除了美味之外,請使用此默認值“ hack”。
listOfLambdas = [lambda i=i: i*i for i in range(6)]
for f in listOfLambdas:
print f()
輸出:
0
1
4
9
16
25
注意i=i。那就是魔術發生的地方。
添加回答
舉報