簡體   English   中英

python中的lambda列表

[英]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只是一個名稱,與用於迭代mylisty無關。 作為一個自由變量,只有在您實際調用該函數后才能找到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM