为什么Python中的lambda函数不闭包参数?
代码更能说明问题:
from pprint import pprint
li = []
for i in range(5):
li.append(lambda : pprint(i))
for k in li:
k()
yield:
4 4 4 4 4
为什么不呢
0 1 2 3 4
??
谢谢。
附言:如果我写完整的装饰器,它就能按预期工作:
from pprint import pprint
li = []
#for i in range(5):
#li.append(lambda : pprint(i))
def closure(i):
def _func():
pprint(i)
return _func
for i in range(5):
li.append(closure(i))
for k in li:
k()
5 个回答
3
如果你不想使用默认参数,因为这样可能会在不小心传入参数时引发错误,你可以使用一个嵌套的lambda表达式:
from pprint import pprint
li = []
for i in range(5):
li.append((lambda x: lambda: pprint(x))(i))
for k in li:
k()
这就是你所说的closure
函数的匿名版本。
3
它确实正确地引用了 i
,但问题在于,当你的列表被填充时,i
的值已经是最后一个项目的值了,也就是循环结束时的值,所以你看到的都是 4
。
12
你需要做的是:
lambda i=i: pprint(i)
而不是捕捉当前的 i
的值