Python 无法通过exec()语句更改函数中的全局变量?
为什么我不能使用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) 测试 根据,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
语句采用两个可选表达式,默认为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()。如果有,那么就不必指定它们,