动态函数中的Python变量范围

时间:2018-02-13 10:50:59

标签: python function variables scope

我最近实现了一个函数工厂,它没有按照我预期的方式调整变量的范围。

我找到了一个解决方案,但我不知道它为什么会起作用。

因此,尽管我并不严格需要解决这个问题,但我已经发布了这个问题,希望能够学习有关变量范围的内容。

有问题的代码

# 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

为什么?所以我的问题是:

  • 为什么第一种方法不起作用?
  • 工作实现与第一个功能有何不同?

1 个答案:

答案 0 :(得分:0)

您的解决方案称为“关闭”。

在第一个示例中,i已更改,创建的函数将返回它。该函数不记录该值并在调用时返回该值。它只返回已经更改的i的当前值。

在第二个示例中,每次调用外部函数时都定义一个新的i,并且其值永远不会更改。