考虑以下工作代码:
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
有背景吗?
1条答案
按热度按时间2izufjch1#
如果提供了本地dict,“eval”将在该本地名称空间中运行。所有的更改都放在本地名称空间中。你可以通过打印看到
loc
听从你的命令。两者x
以及printx
在那个命名空间中。调用函数将建立一个新的本地命名空间。python不嵌套名称空间,所以它只有新的(空的)本地名称空间和全局名称空间,以及x
这两个都不是。你应该先做两次
eval
仅具有全局命名空间的。这样,您的代码就可以工作了,即使这是一种可怕的python编程方式。