函数在 exec 中看不到带有提供的局部变量的局部变量

Function does not see locals in exec with supplied locals

考虑这个工作代码:

x=123

def printx():
     print(x)

如果我执行 printx() 输出将是 123 因为 x 值存在于 locals() 并且 printx 看到了。

我也可以像这样获得 x 值:

locals()["x"]

但是我需要 运行 我在 exec 中的函数提供了全局和局部参数,所以我写了这段代码,它的目的应该与第一个片段相同:

glo = dict()
loc = dict()
exec('x=123', glo, loc)
exec('def printx():\n    print(x)', glo, loc)

但是,当我调用 printx() 时,我得到了这个错误:

exec('printx()', glo, loc)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
  File "<string>", line 2, in printx
NameError: name 'x' is not defined

然而 loc["x"]eval('x', glo, loc) return 123 都符合预期。

如何使局部变量和全局变量可用于我的 printx 函数? 我希望 printx 在具有上下文的 exec 中表现相同?

如果提供了本地字典,则在该本地名称空间中“eval”运行。所有更改都在该本地名称空间中。您可以通过在命令后打印 loc 来查看。 xprintx 都在该名称空间中。调用函数会建立一个新的本地命名空间。 Python 不嵌套命名空间,因此它可用的只有新的(空的)本地命名空间和全局命名空间,而 x 不在其中。

您应该 运行 您的前两个 eval 仅使用全局命名空间。那样的话,你的代码就会工作,即使它是一种可怕的 Python 编程方式。