为什么列表解析给予的结果与本例中的for循环不同(python)?[duplicate]

krcsximq  于 2023-01-11  发布在  Python
关注(0)|答案(1)|浏览(95)
    • 此问题在此处已有答案**:

Creating functions (or lambdas) in a loop (or comprehension)(6个答案)
What do lambda function closures capture?(7个答案)
3小时前关门了。
我使用的语言是Python 3.10,我已经花了一个多星期的时间来查找程序中的bug,结果发现这是由于列表解析没有给出我所期望的结果,我写了一个简单的例子来展示这种行为:

alist = [1,2,3]

d = {}
for a in alist:
d[a] = lambda x: a + x

print([d[a](1) for a in alist])

for a in alist:
print(d[a](1))

这导致:

[4, 4, 4]
2
3
4

有人知道这里发生了什么吗?我想我会停止使用函数字典,但它似乎仍然应该工作。

cqoc49vn

cqoc49vn1#

我会让matszwecja的评论被接受的答案,谢谢!
对于lambda,a被认为是非局部变量,所以它的值是它在封闭作用域中的任何值,它与后面在列表解析中使用的a不同,你可以通过执行lambda x,a=a来强制a成为局部变量:a + x - aka使其成为一个参数,默认值为lambda定义时的a

相关问题