在函数内使用exec设置变量
我刚开始自学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()
的相关警告:
注意: 这个字典的内容不应该被修改;更改可能不会影响解释器使用的局部和自由变量的值。