我在 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
函数返回后保持事件状态。
所以,如果你的嵌套函数没有
- 访问封闭范围的本地变量,
- 当它们在该范围之外执行时这样做,
那么它们不是闭包。
这是一个不是闭包的嵌套函数示例。
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/