python函数在exec中看不到提供了局部变量的局部变量

w41d8nur  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(458)

考虑以下工作代码:

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) 返回 123 一如预期。
我怎样才能让本地人和全球人都能用在我的电脑上 printx 功能?我想要 printx 以同样的方式行事 exec 有背景吗?

2izufjch

2izufjch1#

如果提供了本地dict,“eval”将在该本地名称空间中运行。所有的更改都放在本地名称空间中。你可以通过打印看到 loc 听从你的命令。两者 x 以及 printx 在那个命名空间中。调用函数将建立一个新的本地命名空间。python不嵌套名称空间,所以它只有新的(空的)本地名称空间和全局名称空间,以及 x 这两个都不是。
你应该先做两次 eval 仅具有全局命名空间的。这样,您的代码就可以工作了,即使这是一种可怕的python编程方式。

相关问题