Python 无法通过exec()语句更改函数中的全局变量?

Python 无法通过exec()语句更改函数中的全局变量?,python,exec,global,Python,Exec,Global,为什么我不能使用exec()从函数内部更改全局变量?当赋值语句在exec()之外时,它可以正常工作。下面是我的问题的一个例子: >>> myvar = 'test' >>> def myfunc(): ... global myvar ... exec('myvar = "changed!"') ... print(myvar) ... >>> myfunc() test >>> print(myvar) test >>>myvar=‘测试’ >>>def myfunc

为什么我不能使用exec()从函数内部更改全局变量?当赋值语句在exec()之外时,它可以正常工作。下面是我的问题的一个例子:

>>> myvar = 'test' >>> def myfunc(): ... global myvar ... exec('myvar = "changed!"') ... print(myvar) ... >>> myfunc() test >>> print(myvar) test >>>myvar=‘测试’ >>>def myfunc(): ... 全球myvar ... exec('myvar=“changed!”) ... 打印(myvar) ... >>>myfunc() 测试 >>>打印(myvar) 测试 根据,
exec
语句采用两个可选表达式,默认为
globals()
locals()
,并始终在
locals()
中执行更改(如果有)

所以,请更明确/具体/准确地说…:

>>> def myfunc():
...   exec('myvar="boooh!"', globals())
... 
>>> myfunc()
>>> myvar
'boooh!'
…您将能够将全局变量输入到您的心脏内容中。

这样如何:

>>> myvar = 'test'
>>> def myfunc():
...     exec('globals()["myvar"] = "changed!"')
...     print(myvar)
... 
>>> myfunc()
changed!
>>> print(myvar)
changed!
它在Python2.6中对我有效


编辑:实际上Alex Martelli的解释比我的好得多:)

补充Alex的答案:尽管当你省略局部/全局参数时,它们默认为调用者的局部和全局参数,这只是一个方便的攻击;这并不意味着它们继承调用方的完整执行上下文。特别是:

a。嵌套的范围单元格对执行的代码不可用。所以这是失败的:

def f():
    foo= 1
    def g():
        exec('print foo')
    g()
f()
b<代码>全局声明不会结转到执行的代码中。因此,默认情况下,如您的示例中所示,编写的变量被放入本地词典中。然而,你可以通过说

exec('global myvar\nmyvar = "changed!"')

如果你能帮忙的话,你不会真的想这么做<代码>全局已经不好了,
exec
本身就是一种代码味道!除非真的没有其他选择,否则您不会希望将它们组合起来。

一个小说明-这两个可选参数不会默认为globals()和locals()。如果有,那么就不必指定它们,