列表理解中奇怪的 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】:lambda
s 绑定变量本身,而不是它们拥有的值。 i
在列表解析的末尾更改为2
,因此所有lambda
s 都引用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 行为的主要内容,如果未能解决你的问题,请参考以下文章