亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在循環內創建lambda

在循環內創建lambda

神不在的星期二 2019-07-27 11:12:57
在循環內創建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 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

請改用此行:

lambdas_list.append(lambda obj=obj: obj.some_var)


查看完整回答
反對 回復 2019-07-27
?
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)引用的。

默認分配有效,因為我們ilambda范圍引用。我們使用默認賦值通過使變量成為lambda定義的一部分并因此使其范圍成為隱式“傳遞”變量。

閉包解決方案的工作原理是因為變量“傳遞”是顯式的,lambda直接執行到外部,因此在列表理解期間創建綁定并返回lambda引用該綁定的內部。因此,當內部lambda實際執行時,它將引用在外部lambda范圍中創建的綁定。


查看完整回答
反對 回復 2019-07-27
?
森欄

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))


查看完整回答
反對 回復 2019-07-27
  • 3 回答
  • 0 關注
  • 443 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號