首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python - locals()和闭包

Python - locals()和闭包
EN

Stack Overflow用户
提问于 2012-08-10 04:39:35
回答 2查看 490关注 0票数 6

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

代码语言:javascript
复制
>>> def a():
...     foo = 0
...     print locals()
...     def b():
...         print locals()
...     b()

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

但是:

代码语言:javascript
复制
>>> def a():
...     foo = 0
...     print locals()
...     def b():
            foo
...         print locals()
...     b()

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-10 04:53:27

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

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

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

阅读有关代码对象here的更多信息。

票数 4
EN

Stack Overflow用户

发布于 2012-08-10 04:43:21

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

通过在第二个示例中提到b()中的foo,您可以将foo放入b()中的本地变量中,但它将解析为a()主体中的foo。如果你在b()中赋值foo = 1,你会看到

代码语言:javascript
复制
 {'foo': 0}
 {'foo': 1}

作为输出。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11891591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档