【发布时间】:2023-03-09 15:46:01
【问题描述】:
代码多说:
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??
谢谢。
附:如果我编写完整的装饰器,它会按预期工作:
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()
【问题讨论】:
-
您可以看到这是通过将原始循环移动到一个函数中来关闭变量,然后在
for k in li:行之前调用该函数,因此i在模块级范围。它仍然可以工作(并获得相同的结果,因为它关闭的是引用而不是值),这意味着名称已关闭。 -
谢谢大家。我认为stackoverflow.com/questions/2295290/… 不仅说明了解决方案,还说明了原因。我认为我的问题与stackoverflow.com/questions/2295290/… 重复
-
这能回答你的问题吗? What do (lambda) function closures capture?