在函数内部使用exec设置变量

时间:2014-04-19 09:26:28

标签: python string function variables exec

我刚刚开始自学Python,我需要一点帮助:

old_string = "didnt work"   
new_string = "worked"

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

function()

我希望得到old_string = "worked"

2 个答案:

答案 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()词典总是希望更新相应的全局变量,反之亦然。