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

标签 python closures nested-function

我在 Python 中看到并使用过嵌套函数,它们与闭包的定义相匹配。那么为什么它们被称为“嵌套函数”而不是“闭包”呢?

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

更新:我正在阅读关于闭包的文章,这让我想到了与 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!

在这里,我们将值绑定(bind)到参数的默认值。这发生在创建函数 printer 时,因此在 make_printer 之后不需要维护对 printer 外部的 msg 值的引用 返回。 msg 在此上下文中只是函数 printer 的普通局部变量。

关于python - 为什么python嵌套函数不称为闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020419/

相关文章:

c++ - 我们在 C++ 中有闭包吗?

python - Python中的嵌套函数

c - 嵌套函数在 gcc 中是一件坏事吗?

python - 如何使用 beautifulsoup 提取 onClick url

python - python中不允许嵌套类中的类变量的原因是什么?

node.js - NodeJS 中的内存泄漏和关闭问题

python-3.x - 局部变量如何在 python 3 的嵌套函数中工作?

python - numpy 中是否有 x2fx 的等效函数?

python - 了解 sys.getrefcount 结果的差异

javascript - 一个简单的函数闭包问题——更新计数的计数器函数