在函数内使用exec设置变量

54 投票
2 回答
44221 浏览
提问于 2025-04-18 03:22

我刚开始自学Python,现在需要一点帮助来理解这个脚本:

old_string = "didnt work"   
new_string = "worked"

def function():
    exec("old_string = new_string")     
    print(old_string) 

function()

我想把它改成 old_string = "worked"

2 个回答

13

有一种替代的方法可以让exec在函数内部更新你的全局变量,那就是把globals()传进去。

>>> def function(command):
...    exec(command, globals())
...
>>> x = 1
>>> function('x += 1')
>>> print(x)
2

locals()不同,更新globals()这个字典时,通常会直接更新对应的全局变量。

47

你快到了。你想要修改一个全局变量,所以你需要加上 global 这个声明:

old_string = "didn't work"
new_string = "worked"

def function():
    exec("global old_string; old_string = new_string")
    print(old_string)

function()

如果你运行下面这个版本,你就能看到你之前版本发生了什么:

old_string = "didn't work"
new_string = "worked"

def function():
    _locals = locals()
    exec("old_string = new_string", globals(), _locals)
    print(old_string)
    print(_locals)

function()

输出:

didn't work
{'old_string': 'worked'}

你运行的方式让你试图去修改 exec 函数的局部变量,这基本上是没有定义的行为。可以看看 exec 的文档里的警告:

注意: 默认的 locals 行为和下面的函数 locals() 描述的一样:不应该尝试修改默认的 locals 字典。如果你需要在函数 exec() 返回后查看代码对 locals 的影响,请传递一个明确的 locals 字典。

还有关于 locals() 的相关警告:

注意: 这个字典的内容不应该被修改;更改可能不会影响解释器使用的局部和自由变量的值。

撰写回答