3

我在列表理解中使用 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

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

4

1 回答 1

9

lambdas 绑定变量本身,而不是它们拥有的值。i更改为2在列表理解的末尾,所以所有的lambdas 都i在那个时候引用,因此引用 2。

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

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

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

于 2013-04-04T14:51:54.673 回答