我找不到对这种行为的充分解释。
>>> 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()的详细描述。
发布于 2012-08-10 04:53:27
locals()内置函数打印本地符号表,该符号表绑定到代码对象,并在解释器收到源代码中的名称时填满。
第二个例子,在反汇编时,将在b函数代码中包含LOAD_GLOBAL foo字节码指令。此LOAD_GLOBAL指令将向上移动作用域,找到外部foo名称,并通过将名称偏移量添加到闭包的(函数b)代码对象的co_names属性中,将其绑定到代码对象。
locals()函数打印本地符号表(如前所述,是函数代码对象的co_names属性)。
阅读有关代码对象here的更多信息。
发布于 2012-08-10 04:43:21
如果在闭包中没有赋值给foo,Python会将其解析为上一级作用域的foo (直到在某个地方找到foo或抛出异常)。
通过在第二个示例中提到b()中的foo,您可以将foo放入b()中的本地变量中,但它将解析为a()主体中的foo。如果你在b()中赋值foo = 1,你会看到
{'foo': 0}
{'foo': 1}作为输出。
https://stackoverflow.com/questions/11891591
复制相似问题