不同表达式的Lambda返回相同的输出



以以下代码片段为例:

a = []
for x in range(2):
a.append(lambda: print(x))
print(a[0](), a[1]())

输出为:

1 1

但我期望它是

0 1

如何解决这个问题?

使用默认参数:

a = []
for x in range(2):
a.append(lambda x = x: print(x))
print(a[0](), a[1]())

这是有效的,因为默认值是在创建函数时计算的。否则,所有lambda函数将指向x的最后一个值,即1。

@sarartur已经提供了解决方案。下面是对这种行为的更多解释。

这被称为晚期绑定闭包。引用自博客

Python的闭包是后期绑定。这意味着在调用内部函数时查找闭包中使用的变量的值。

因此,无论何时调用任何返回的函数,i的值都会在调用时在周围的作用域中查找。此时,循环完成,i的最终值为1。

这是因为您的lambda表达式正在打印x,但x正在由您的for循环更新,所以当您的lambda表达式被调用时,x已经完成了1的值,因为这是range(2)中的最后一个值。

>>> for num in range(10):
...     pass
...
>>> num
9

最新更新