您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python exec()中的全局变量和局部变量

python exec()中的全局变量和局部变量

好吧,我认为这可能是实现错误,也可能是未经证明的设计决策。问题的症结在于模块范围内的名称绑定操作应绑定到全局变量。实现的方式是,在模块级别,globals()是locals()(在解释器中尝试该值),因此,当您进行任何名称绑定时,它会像往常一样将其分配给locals( )字典,它也是全局变量,因此创建了全局变量

查找变量时,首先检查当前的本地变量,如果未找到名称,则递归检查包含范围的本地变量变量名称,直到找到变量或到达模块作用域为止。如果达到此目的,则检查全局变量,该全局变量应该是模块作用域的本地变量。

>>> exec(compile("import sys\nprint sys._getframe().f_code.co_name", "blah", "exec"), {}, {})
<module>
>>> exec("a = 1\nclass A(object):\n\tprint a\n", {}, {})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 2, in <module>
  File "<string>", line 3, in A
NameError: name 'a' is not defined
>>> d = {}
>>> exec("a = 1\nclass A(object):\n\tprint a\n", d,d)
1

此行为是继承起作用的原因(名称查找使用了代码对象的作用域locals(),其中确实包含A)。

最后,这是cpython实现中的一个丑陋的骇客,专门用于对全局变量进行查找。它还会导致一些荒谬的人为情况-例如:

>>> def f():
...     global a
...     a = 1
...
>>> f()
>>> 'a' in locals()
True

请注意,这是我在阅读python语言参考的第4.1节(命名和绑定)时基于与解释器混淆的所有推断。尽管这不是确定的(我还没有打开cpython的源代码),但我相当确定我对行为是正确的。

python 2022/1/1 18:30:02 有474人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶