【问题标题】:Python variable scope in dynamic functions [duplicate]动态函数中的Python变量范围[重复]
【发布时间】:2018-02-13 10:50:58
【问题描述】:

我最近实现了一个函数工厂,它没有像我预期的那样作用域变量。

我找到了一个解决方案,但我不知道它为什么有效。

因此,虽然我并不严格需要解决这个问题,但我发布了这个问题,希望了解有关变量范围的一些知识。

有问题的代码

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

给出相同的输出;总是最后一个循环元素:

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

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

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

【问题讨论】:

  • 我猜返回函数返回它的值而不是引用。因此,第二个代码有效。虽然我不完全确定。

标签: python function variables scope


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 2016-09-25
    • 2017-08-09
    • 2020-08-14
    • 2014-02-05
    • 2013-07-08
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多