我最近实现了一个函数工厂,它没有按照我预期的方式调整变量的范围。
我找到了一个解决方案,但我不知道它为什么会起作用。
因此,尽管我并不严格需要解决这个问题,但我已经发布了这个问题,希望能够学习有关变量范围的内容。
有问题的代码
# Create function list
func_list = []
for i in [1, 2]:
def _func():
print("%i" % i)
func_list.append(_func)
# Execute
for f in func_list:
f()
给予同样的ouptut;总是最后一个循环元素:
2
2
解决方案
# Create function list
def make_func(i):
def _func():
print("%i" % i)
return _func
func_list = []
for i in [1, 2]:
func_list.append(make_func(i))
# Execute
for f in func_list:
f()
一直给出我的期望:
1
2
为什么?所以我的问题是:
答案 0 :(得分:0)
您的解决方案称为“关闭”。
在第一个示例中,i
已更改,创建的函数将返回它。该函数不记录该值并在调用时返回该值。它只返回已经更改的i
的当前值。
在第二个示例中,每次调用外部函数时都定义一个新的i
,并且其值永远不会更改。