我刚刚开始自学Python,我需要一点帮助:
old_string = "didnt work"
new_string = "worked"
def function():
exec("old_string = new_string")
print(old_string)
function()
我希望得到old_string = "worked"
。
答案 0 :(得分:11)
你几乎就在那里。您正在尝试修改全局变量,因此您必须添加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
docs:
注意:默认 locals 的行为与下面的函数
locals()
相同:对默认 locals 字典的修改不应该是尝试。如果您需要在函数exec()
返回后查看代码对 locals 的影响,请传递显式的 locals 字典。
以及locals()
上的相关警告:
注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
答案 1 :(得分:4)
让exec
从函数内部更新全局变量的另一种方法是将globals()
传递给函数。
>>> def function(command):
... exec(command, globals())
...
>>> x = 1
>>> function('x += 1')
>>> print(x)
2
与locals()
不同的是,更新globals()
词典总是希望更新相应的全局变量,反之亦然。