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()相同的字典,您可以修改该字典并在全局命名空间中查看结果。