Python 在函数中使用exec设置变量

Python 在函数中使用exec设置变量,python,string,function,variables,exec,Python,String,Function,Variables,Exec,我刚刚开始自学Python,我需要一些关于这个脚本的帮助: old_string = "didnt work" new_string = "worked" def function(): exec("old_string = new_string") print(old_string) function() 我想得到它,这样你就快到了。您试图修改全局变量,因此必须添加global语句: old_string = "didn't work" new_stri

我刚刚开始自学Python,我需要一些关于这个脚本的帮助:

old_string = "didnt work"   
new_string = "worked"

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

function()

我想得到它,这样你就快到了。您试图修改全局变量,因此必须添加
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
中修改函数的局部变量,这基本上是未定义的行为。请参阅中的警告:

注意:默认局部变量的作用与下面的函数
locals()
所述相同:不应尝试修改默认局部变量字典。如果需要在函数
exec()
返回后查看代码对局部变量的影响,请传递一个显式局部变量字典

及有关警告:

注意:本词典的内容不得修改;更改可能不会影响解释器使用的本地变量和自由变量的值


exec
从函数内部更新全局变量的另一种方法是将
globals()
传递到函数中

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

locals()
不同,更新
globals()
字典总是要更新相应的全局变量,反之亦然

这有什么意义?你为什么要在这里使用exec?“我刚开始自学Python…”听起来他们只是在试图用一种新的语言来学习…有没有办法在调用函数的范围内修改它?@讽刺的是,这里没有调用函数。。如果您想知道与问题或答案相关的问题,您应该提出一个新问题(具有适当的上下文、代码示例等)。在3年前的答案的注释中留下新问题可能对任何人都没有帮助……而不是添加一个
全局
声明,您可以简单地设置名称空间:
exec('old_string=new_string',globals(),globals())
@MartijnPieters,如果您这样做(
exec('..,globals(),globals())
),在exec中创建的任何变量都会变成全局变量——可能不是您想要的?是的,这可能是目标。大多数人忘记了指定名称空间(包括新字典)的功能,如果您不希望所有名称都使用自定义名称空间作为全局名称,然后提取以后需要的内容,那么无论如何可能是更好的选择。请尝试
函数(“[t代表范围(5)]”)
,然后
打印(t)
。。。也许有太多的意外后果?@thebjorn我得到了
名称错误:名称“t”没有定义,这是我所期望的。在他们修复变量逃逸理解错误之前,您使用的是旧版本的Python吗?一直都是2.7!(叹气)。他们也修复了for循环变量escape吗?不,如果我理解正确的话。我认为这是有意的行为。