列表理解中奇怪的lambda行为

时间:2013-04-04 14:49:49

标签: python python-3.x lambda list-comprehension

我正在使用list comprehension中的lambda函数,并发现了一些奇怪的行为

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

有人可以解释为什么结果不是我期望的吗?

1 个答案:

答案 0 :(得分:9)

lambda绑定变量本身,而不是它们拥有的值。在列表理解结束时,i更改为2,因此所有lambda在此时都引用i,因此请参阅2.

为避免这种情况,您可以使用默认参数技巧

[lambda x,i=i:i for i in range(3)]

这将i的值绑定在默认参数中(在函数定义时计算)。