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

时间:2010-01-18 01:05:37

标签: python exec global

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

>>> myvar = 'test'
>>> def myfunc():
...     global myvar
...     exec('myvar = "changed!"')
...     print(myvar)
... 
>>> myfunc()
test
>>> print(myvar)
test

3 个答案:

答案 0 :(得分:27)

根据the docsexec语句采用两个可选表达式,默认为globals()locals(),并始终在locals()中执行更改(如果有)一个。

所以,只是更明确/具体/准确......:

>>> def myfunc():
...   exec('myvar="boooh!"', globals())
... 
>>> myfunc()
>>> myvar
'boooh!'

...并且你将能够将全局变量破坏到你心中的内容。

答案 1 :(得分:4)

添加到Alex的答案:虽然当你省略locals / globals参数时,它们默认为调用者的locals和globals,这只是一个方便的hack;它 not 意味着他们继承了调用者的完整执行上下文。特别是:

一个。嵌套的范围单元格不适用于已执行的代码。所以这失败了:

def f():
    foo= 1
    def g():
        exec('print foo')
    g()
f()

global声明不会延续到执行的代码中。因此,默认情况下,在您的示例中,编写的变量放在locals字典中。但是,您可以通过说

来使其工作
exec('global myvar\nmyvar = "changed!"')

如果你能提供帮助,你真的不想这样做。 global已经不是很好了exec本身就是代码味道!除非没有其他选择,否则你不想把它们组合起来。

答案 2 :(得分:3)

这个怎么样:

>>> myvar = 'test'
>>> def myfunc():
...     exec('globals()["myvar"] = "changed!"')
...     print(myvar)
... 
>>> myfunc()
changed!
>>> print(myvar)
changed!

它在Python 2.6中适用于我。

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