gpt4 book ai didi

python - Lambdas 和列表理解

转载 作者:行者123 更新时间:2023-11-28 22:12:10 24 4
gpt4 key购买 nike

我试图了解以下词典的不同之处,因为它们在作为参数传递给第三方库的函数时会产生不同的结果。

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

最佳答案

不同的 lambda 不会相互比较相等,即使它们做同样的事情也是如此。因此,包含这些 lambda 的对象也将比较不相等。

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

至于为什么前两个版本不起作用,是因为当捕获i时,它是变量i,而不是当前的值(value)。在当前迭代期间,lambda 不绑定(bind)到 i 的卡住值,而是绑定(bind)到变量本身,它在连续的循环迭代中发生变化。

另请参阅:

关于python - Lambdas 和列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55172137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com