我已经在Python中看到并使用了嵌套函数,它们与闭包的定义相匹配.那他们为什么叫nested functions而不是closures?
嵌套函数是不是闭包,因为它们不被外部世界使用?
更新:我正在阅读关于闭包的内容,这让我想到了关于Python的这个概念.我在下面的评论中搜索并找到了某人提到的文章,但我无法完全理解该文章中的解释,所以这就是我提出这个问题的原因.
"学习Python,第四版." 提到:
稍后调用嵌套函数时会查找封闭的范围变量.
但是,我认为当一个函数退出时,它的所有本地引用都会消失.
def makeActions():
acts = []
for i in range(5): # Tries to remember each i
acts.append(lambda x: i ** x) # All remember same last i!
return acts
Run Code Online (Sandbox Code Playgroud)
makeActions()[n]每个人都是一样的,n因为变量i在调用时以某种方式查找.Python如何查找此变量?难道它根本不存在因为makeActions已经退出了吗?为什么Python不执行代码直观建议,并通过在循环运行时用for循环中的当前值替换i来定义每个函数?
从评论到THC4k:
我认为我错误地认为Python在内存中构建函数的方式.我在想,当遇到a makeActions()[n]或者a时n,Python会生成与该函数相关的所有必要的机器指令,并将其保存在内存中的某处.现在我认为它更像是将函数保存为文本字符串(并将其与闭包所需的引用捆绑在一起),并在每次调用函数时重新解析它.
如何获取当前范围的非局部变量?功能vars,locals并且globals存在,但是有一个功能来获得nonlocals?
调用时为什么不列出nonlocals vars?
我的问题是,有没有办法来枚举当前范围内都有效的变量,既不vars或globals包括非本地人AFAICT.
我经常使用vars如下代码:
'{meh[0]}/{meh[3]} {a}{b}{c}'.format(**vars())
Run Code Online (Sandbox Code Playgroud)
如果这些变量中的任何变量都在包含函数的范围内,则会失败.