簡體   English   中英

Lambda和列表理解

[英]Lambdas and list comprehension

我試圖了解以下字典的不同之處,因為當將它們作為參數傳遞給第三方庫的函數時,它們會產生不同的結果。

x = list(range(50))
y = list(range(50))

vars = [x, y]

d = [{'func': lambda z: vars[i]} for i in range(len(vars))]
d2 = list({'func': lambda z: vars[i]} for i in range(len(vars)))
d3 = [{'func': lambda z: vars[0]}, {'func': lambda z: vars[1]}]

print(d == d2)  # False
print(d == d3)  # False
print(d2 == d3)  # False

根據我的理解,所有三個字典應該相同,但是檢查變量會發現每種字典的功能類型不同:

d -> function <listcomp>.<lambda>
d2 -> function <genexpr>.<lambda>
d3 -> function <lambda>

就我的用例而言,只有d3實現有效(這意味着如果不對exec做一些令人恐懼的事情,我將無法采用更動態的方法)。 有人可以幫助我了解這三種Lambda之間的區別嗎?

編輯

在每個人的幫助下更好地了解作用域之后,我可以通過將變量作為關鍵字arg包含在函數中來使我的代碼運行:

d = [{'func': lambda x, z=vars[i]: z * x} for i in range(len(vars))]

如常見問題頁面所建議: https : //docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the -same-結果

不同的lambda彼此之間並不相等,即使它們做相同的事情也是如此。 因此,包含這些lambda的對象也將比較不相等。

>>> f1 = lambda z: vars[i]
>>> f2 = lambda z: vars[i]
>>> f1 == f2
False

至於為什么前兩個版本不起作用,是因為當i被捕獲時,它是變量 i ,而不是它的當前值。 Lambda不在當前迭代期間綁定到i的凍結值,而是綁定到變量本身,該變量在連續的循環迭代中發生變化。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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