Python - locals()和闭包

Ven*_*rol 4 python closures locals

我找不到这种行为的充分解释.

>>> def a():
...     foo = 0
...     print locals()
...     def b():
...         print locals()
...     b()

>>> a()
{'foo': 0}
{}
Run Code Online (Sandbox Code Playgroud)

但:

>>> def a():
...     foo = 0
...     print locals()
...     def b():
            foo
...         print locals()
...     b()

>>> a()
{'foo': 0}
{'foo': 0}
Run Code Online (Sandbox Code Playgroud)

我理解在第二种情况下有一个闭包,但我找不到实际是什么以及在什么条件下应该返回函数的详细描述locals().

Mic*_*ler 5

如果你没有foo在闭包内分配,Python会将它解析到foo一个级别的范围内(并且直到它找到foo某个地方或抛出异常).

通过提foob()的第二个例子,你把foo到当地人中b(),但它解析为foo体内a().如果分配,也就是说,foo = 1b(),你会看到

 {'foo': 0}
 {'foo': 1}
Run Code Online (Sandbox Code Playgroud)

作为输出.


Ros*_*nko 4

locals() 内置函数打印绑定到代码对象的本地符号表,并在解释器收到源代码中的名称时填充。

第二个示例,反汇编时,将在b函数代码中包含LOAD_GLOBAL foo字节码指令。此 LOAD_GLOBAL 指令将向上移动作用域,找到外部 foo 名称,并通过将名称偏移添加到闭包(函数 b)代码对象的co_names属性中将其绑定到代码对象。

locals() 函数打印本地符号表(如前所述,函数代码对象的 co_names 属性)。

在此处阅读有关代码对象的更多信息。