为什么python嵌套函数叫闭包?

问题:

我已经在Python中看到并使用了嵌套函数,并且它们与闭包的定义相匹配。那么为什么他们叫nested functions而不是closures
嵌套函数是否不被封闭,因为它们不被外部世界使用?
 更新:我正在阅读关于闭包,并让我考虑到Python这个概念。我搜索并发现有人在下面的评论中提到的文章,但我不能完全理解该文章中的解释,所以这就是为什么我问这个问题。

回答:

当函数可以从已经完成其执行的封闭作用域访问局部变量时,会发生闭包。

def make_printer(msg):
    def printer():
        print msg
    return printer

printer = make_printer('Foo!')
printer()

make_printer被调用时,一个新的帧被放在堆栈上,其中printer函数的编译代码作为一个常量,值为msg作为一个本地。然后创建并返回该功能。因为函数printer引用msg变量,所以在make_printer函数返回后,它将保持活动。
所以,如果你的嵌套函数没有

  1. 访问封闭范围本地的变量,
  2. 在执行该范围之外执行此操作时,

那么他们不是关闭。
这是一个嵌套函数的例子,它不是闭包。

def make_printer(msg):
    def printer(msg=msg):
        print msg
    return printer

printer = make_printer("Foo!")
printer()  #Output: Foo!

在这里,我们将值绑定到参数的默认值。当函数printer被创建时,会发生这种情况,所以在make_printer返回后,不需要维护printer外部的msg的值的引用。 msg在这个上下文中只是函数printer的一个常规局部变量。

 
 Code问答: codewenda.com
Stackoverflow:Why aren’t python nested functions called closures?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

98 − 96 =