列表理解中奇怪的 lambda 行为

Posted

技术标签:

【中文标题】列表理解中奇怪的 lambda 行为【英文标题】:Weird lambda behaviour in list comprehension [duplicate] 【发布时间】:2013-03-26 17:27:22 【问题描述】:

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

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

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

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

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

【讨论】:

+1 清晰简洁 [lambda x,j=i:j for i in range(3)] 会更清晰。 如果你想使用 lambda 来定义一个函数,那么给它应用一个变量。尽管具有相同的符号,但 lambda 中的变量并不是 OP 认为的那样。所以这可能是 OP 想要的:[ (lambda a:a)(i) for i in range(3)]

以上是关于列表理解中奇怪的 lambda 行为的主要内容,如果未能解决你的问题,请参考以下文章

类中奇怪的异步/等待行为

zsh 中奇怪的“工作”行为

UIImageView 中奇怪的对齐行为

Chrome中奇怪的document.cookie行为[重复]

C中奇怪的malloc行为

Firefox 中奇怪的引导进度条行为