一尘不染

为什么python嵌套函数不称为闭包?

python

我已经在Python中看到并使用了嵌套函数,它们与闭包的定义匹配。那么为什么叫他们nested functions而不是closures

嵌套函数不是因为外部世界不使用闭包吗?

更新:我正在阅读有关闭包的知识,这让我开始思考关于Python的这个概念。我搜索并找到某人在下面的评论中提到的文章,但是我无法完全理解该文章中的解释,所以这就是为什么我问这个问题。


阅读 499

收藏
2020-02-16

共1个答案

一尘不染

当函数可以从完成其执行的封闭范围访问局部变量时,就会发生关闭。

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创建函数时会发生这种情况,因此返回 后无需保留对msgexternal 值的引用。在这种情况下只是函数的普通局部变量。printermake_printermsgprinter

2020-02-16