gpt4 book ai didi

python - 为什么无法访问 Python exec 中的模块级变量?

转载 作者:太空狗 更新时间:2023-10-29 20:14:19 24 4
gpt4 key购买 nike

我正在尝试在 project 中使用 Python 的 exec执行嵌入式 Python 代码。

我遇到的问题是,在exec 语句中在模块级 创建的变量不可访问相同的模块。

假设您有以下 Python 程序:

x = 5
def foo():
print x
foo()

如果你将以上四行放在一个文件中并运行它,它就没有问题。

但是,如果您尝试从 exec 语句中运行同一段代码,它将无法运行。

这是我们之前的程序,在 exec 语句中:

import __builtin__

global_env = {'__builtins__': __builtin__}
local_env = dict()

exec """
x = 5
def foo():
print x
foo()
""" in global_env, local_env

在执行时,它没有工作,而是产生以下错误:

Traceback (most recent call last):
File "lab.py", line 94, in <module>
""" in global_env, local_env
File "<string>", line 5, in <module>
File "<string>", line 4, in foo
NameError: global name 'x' is not defined

我认为模块级变量是全局存储的,但看起来,至少在 exec 中,它们不是。

例如,在前面的示例中,如果您将对 foo() 的调用替换为:

print global_env
print local_env

你得到:

{'__builtins__': <module '__builtin__' (built-in)>}
{'x': 5, 'foo': <function foo at 0x102c12938>}

因此,在模块级定义的任何内容(包括 x)都存储在 locals() 中。

但是除了模块级(exec 语句)之外的任何地方都不可能访问x。特别是,正如我们在上面看到的,x 的局部作用域对于同一 exec 语句中定义的函数是不可见的。

解决方法

我找到了两种方法来解决这个问题,并使 x 再次可访问。

第一个是在函数中使用global关键字:

exec """
x = 5
def foo():
global x
print x
foo()
""" in global_env, local_env

第二个是在 exec 中为 globals()locals() 使用相同的字典:

exec """
x = 5
def foo():
print x
foo()
""" in global_env

但是,这些只是半修复/解决方法,无法解决原始问题。

所以我的问题是:为什么 exec 中的模块级变量存储在本地,为什么除了模块级之外的任何地方都无法访问

一些密切相关的 StackOverflow 帖子:

最佳答案

要了解发生了什么,您需要阅读 the docs很接近的。关键部分说:

If two separate objects are given as globals and locals, the code will be executed as if it were embedded in a class definition.

这意味着局部赋值会进入局部命名空间(相当于类级变量),但如果函数(即方法)尝试引用局部(类)变量,则它们不会成为闭包。

将您的代码与:

class Test(object):
x = 1
def foo():
print x
foo()

出于同样的原因,你会得到同样的错误。 foo 不是闭包,因此它尝试在全局命名空间中引用 x(未成功)。

关于python - 为什么无法访问 Python exec 中的模块级变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com