来自论坛:
Q: 我不明白为什么即使一个嵌套函数完美的符合闭包的定义,但仅仅因为它没有被外部引用,就不是闭包。
与许多其他的计算术语一样,不同的人以不同的方式使用“闭包”这个词。
严格来讲,闭包就是一个带有自由变量的函数,所有的这些绑定都是提前知道的。
一些早期的编程语言并没有”closed”函数;自由变量的绑定是开放的,并在运行时被确定。有些语言同时具有“开放”与“封闭”函数,我们就需要一种方式来区分二者,于是人们就就开始把后者称为“闭包”。
但是在python和大部分其他的现代编程语言中,所有的函数都是“封闭的”——没有“开放”的自由变量——所以“闭包”这个术语的用法从“所有自由变量都有已知绑定的函数”转变成“一个可以引用不再活动环境的函数”(就像外部函数的本地命名空间,即便该函数已经返回)。因为这很难实现,而程序员不喜欢隐藏那以实现的东西,人们仍然使用术语去区分第一种封闭函数和第二种封闭函数。在这个论坛的线程中,人们有时会争论当你用一种特定的方式去使用第二种封闭函数,他并不像你以另一种方式使用它时更像封闭函数。
见鬼,一些人甚至认为如果一门语言不支持第三种封闭函数(一种目前Python还不支持的封闭函数),那么这门语言实际上根本就没有闭包。
但是作为一名语言使用者,实际上你完全可以忽略这些——你只需要知道在Python中,所有的函数都是封闭的,自由变量绑定词法嵌套的外部作用域变量名。
By Fredrik Lundh
翻译自博客 与http://effbot.org/zone/closure.htm 2020/2/12 23:50