Python 3.x 如何更改exec()函数中变量的值?
代码如下:Python 3.x 如何更改exec()函数中变量的值?,python-3.x,Python 3.x,代码如下: def test(): c = 0 exec('c = 4 + 5') print('result', c) c的值为0。我能做些什么来修复它,让exec()函数中的c值改变?在cpython中,你不能在函数中做你想做的事情。这是因为函数的本地名称空间不能被其他代码轻松编辑(编辑locals()返回的字典不起作用)。如果您从模块的顶层调用exec,它将按您的意愿工作,但这可能仍然是一个坏主意 更好的方法可能是使用名称空间字典。您可以将其传递到exec,更改将
def test():
c = 0
exec('c = 4 + 5')
print('result', c)
c
的值为0。我能做些什么来修复它,让exec()
函数中的c
值改变?在cpython中,你不能在函数中做你想做的事情。这是因为函数的本地名称空间不能被其他代码轻松编辑(编辑locals()
返回的字典不起作用)。如果您从模块的顶层调用exec
,它将按您的意愿工作,但这可能仍然是一个坏主意
更好的方法可能是使用名称空间字典。您可以将其传递到exec
,更改将显示在那里,而不是函数的本地命名空间或模块的全局命名空间中:
def test():
namespace = {'c': 0}
exec('c = 4 + 5', namespace)
print('result', namespace['c'])
非常感谢。“如果你从模块的顶层调用exec”是什么意思?我不明白……你能给我举个例子吗?@xinchen我的意思是,如果
exec
和其他行不在test
函数中,你的代码就可以工作了。这是因为不带名称空间参数的exec
调用相当于exec(无论如何,globals(),locals())
。在函数内部,您无法有效地将值保存到由局部变量返回的字典中,因此这对您没有多大好处。但在顶层,locals()
返回与globals()相同的字典,您可以修改该字典并在全局命名空间中查看结果。