6

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

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

>>> a()
{'foo': 0}
{}

但:

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

>>> a()
{'foo': 0}
{'foo': 0}

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

4

2 回答 2

5

如果你没有foo在闭包内赋值,Python 会将其解析为foo作用域的上一级(直到找到foo某个地方或抛出异常)。

通过在第二个示例中提到foowithin ,您将locals 放入了 内,但它解析为. 如果你分配,比如说,in ,你会看到b()foob()fooa()foo = 1b()

 {'foo': 0}
 {'foo': 1}

作为输出。

于 2012-08-09T20:43:20.717 回答
4

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

第二个例子,当反汇编时,将在b函数代码中包含LOAD_GLOBAL foo字节码指令。此 LOAD_GLOBAL 指令将向上移动范围,找到外部 foo 名称并将其绑定到代码对象,方法是将名称偏移量添加到闭包(函数 b)代码对象的co_names属性中。

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

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

于 2012-08-09T20:53:26.673 回答