本文介绍了列表理解中的奇怪lambda行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用列表推导中的lambda函数,并且发现了一些奇怪的行为
I'm playing with lambda functions inside of list comprehension, and found some weird behaviour
x = [(lambda x: i) for i in range(3)]
print(x[0](0)) #print 2 instead of 0
print(x[1](0)) #print 2 instead of 1
print(x[2](0)) #print 2
有人可以解释为什么结果不是我所期望的吗?
Can someone explain why the result is not that I expect?
推荐答案
lambda
s绑定变量本身,而不是绑定变量的值.在列表理解的末尾,i
更改为2
,因此所有lambda
都在那一刻指的是i
,因此指的是2.
lambda
s bind variables themselves, not the values that they had. i
is changed to 2
at the end of the list comprehension, so all the lambda
s refer to i
at that point, and thus refer to 2.
为避免这种情况,您可以使用默认参数把戏:
To avoid this, you can use the default argument trick:
[lambda x,i=i:i for i in range(3)]
这会将i
的值绑定到默认参数(在函数定义时评估).
This binds the value of i
in the default argument (which is evaluated at function definition time).
这篇关于列表理解中的奇怪lambda行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!