为什么我不能使用exec()从函数内部更改全局变量?当赋值语句在exec()之外时,它工作正常。这是我的问题的一个例子:
>>> myvar = 'test' >>> def myfunc(): ... global myvar ... exec('myvar = "changed!"') ... print(myvar) ... >>> myfunc() test >>> print(myvar) test
答案 0 :(得分:27)
根据the docs,exec
语句采用两个可选表达式,默认为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的解释比我的好得多:)