lambda函数不closuresPython中的参数?

代码说话更多:

from pprint import pprint li = [] for i in range(5): li.append(lambda : pprint(i)) for k in li: k() 

产量:

 4
 4
 4
 4
 4

为什么不

 0
 1
 2
 3
 4

??

谢谢。

PS如果我写完整的装饰,它按预期工作:

 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() 

你需要做的是:

 lambda i=i: pprint(i) 

而是捕捉我的当前值

它确实引用了i ,唯一的事情是,当你的列表被填充的时候,当迭代结束时, i将有序列中的最后一个项目的值,所以这就是为什么你看完4

如果你不想使用一个默认的参数 – 如果不小心调用了参数,可能会引入错误 – 你可以使用一个嵌套的lambda:

 from pprint import pprint li = [] for i in range(5): li.append((lambda x: lambda: pprint(x))(i)) for k in li: k() 

这是您的closurefunction的匿名版本。

lambda函数通过ivariables创build闭包。 第一个for循环完成后, i有价值4

然后第二个循环开始,所有的lambda函数被执行。 他们每个然后打印我的当前值,这是4

答案是:因为lambda中的代码正在使用您的全局variablesi

你的第二个变种将做与第一个与lambda相同,如果你删除参数i

 def closure(): 

代替

 def closure(i): 

即该函数内的代码将使用全局variablesi