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()
这是您的closure
function的匿名版本。
lambda函数通过i
variables创build闭包。 第一个for
循环完成后, i
有价值4
。
然后第二个循环开始,所有的lambda函数被执行。 他们每个然后打印我的当前值,这是4
。
答案是:因为lambda中的代码正在使用您的全局variablesi
。
你的第二个变种将做与第一个与lambda相同,如果你删除参数i
:
def closure():
代替
def closure(i):
即该函数内的代码将使用全局variablesi
。