[英]Python list of nested lambdas executes last element of lambda list only
[英]list of lambdas in python
我已經看到了這個問題 ,但是我仍然無法理解為什么這樣簡單的示例不起作用:
mylist = ["alice", "bob", "greta"]
funcdict = dict(((y, lambda x: x==str(y)) for y in mylist))
funcdict['alice']("greta")
#True
funcdict['alice']("alice")
#False
funcdict['greta']("greta")
#True
與以下內容有何不同?
[(y, y) for y in mylist]
為什么在迭代的每個步驟中都不對y
求值?
lambda
表達式主體中的y
只是一個名稱,與用於迭代mylist
的y
無關。 作為一個自由變量,只有在您實際調用該函數后才能找到y
的值,此時該函數將使用y
在調用范圍內的任何值。
要實際上在定義時強制y
具有一個值,您需要通過一個參數使其局部化:
dict((y, lambda x, y=z: x == str(y)) for z in mylist)
((y, lambda x: x==str(y)) for y in mylist)
在定義genration表達式時,lambda內部的y
不綁定,但在調用時綁定。 調用時,迭代已經完成,因此y
引用了最后一項greta
。
解決此問題的一種方法是使用關鍵字參數,該關鍵字參數在定義函數/ lambda時進行評估:
funcdict = dict((y, lambda x, y=y: x == y) for y in mylist)
funcdict = {y: lambda x, y=y: x == y for y in mylist} # dict-comprehension
或者您可以使用partial
:
funcdict = {y: partial(operator.eq, y) for y in mylist}
在迭代mylist
評估y
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.