以以下代码片段为例:
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