在循環內創建lambda 我試圖在循環中創建lambdas迭代一個對象列表:lambdas_list = []for obj in obj_list:
lambdas_list.append(lambda : obj.some_var)現在,如果我遍歷lambdas列表并像這樣調用它們:for f in lambdas_list:
print f()我得到了相同的價值。這是最后的價值obj在obj_list,因為那是在列表迭代器的塊中的最后一個變量。任何想法都能很好地(pythonic)重寫代碼以使其工作?
3 回答

MM們
TA貢獻1886條經驗 獲得超2個贊
您必須使用默認分配捕獲變量
lambdas_list = [ lambda i=o: i.some_var for o in obj_list ]
或者,使用閉包來捕獲變量
lambdas_list = [ (lambda a: lambda: a.some_var)(o) for o in obj_list ]
在這兩種情況下,關鍵是確保將obj_list列表中的每個值分配給唯一范圍。
您的解決方案不起作用,因為詞法變量obj
是從父作用域(the for
)引用的。
默認分配有效,因為我們i
從lambda
范圍引用。我們使用默認賦值通過使變量成為lambda
定義的一部分并因此使其范圍成為隱式“傳遞”變量。
閉包解決方案的工作原理是因為變量“傳遞”是顯式的,lambda
直接執行到外部,因此在列表理解期間創建綁定并返回lambda
引用該綁定的內部。因此,當內部lambda
實際執行時,它將引用在外部lambda
范圍中創建的綁定。

森欄
TA貢獻1810條經驗 獲得超5個贊
你可以這樣做:
def build_lambda(obj): return lambda : obj.some_var lambdas_list = []for obj in obj_list: lambdas_list.append(build_lambda(obj))
添加回答
舉報
0/150
提交
取消