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

lin*_*r03 21 python global exec

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

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

Ale*_*lli 29

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

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

>>> def myfunc():
...   exec('myvar="boooh!"', globals())
... 
>>> myfunc()
>>> myvar
'boooh!'
Run Code Online (Sandbox Code Playgroud)

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

  • 在 Python 3 中,[`exec()` 现在是一个函数,并且文档已移动](https://docs.python.org/3/library/functions.html#exec) (2认同)

bob*_*nce 5

添加到亚历克斯的答案:尽管当您省略 locals/globals 参数时,它们默认为调用者的 locals 和 globals,但这只是一个方便的技巧;它意味着他们继承呼叫者的全面执行上下文。特别是:

一种。嵌套的作用域单元不适用于 execed 代码。所以这失败了:

def f():
    foo= 1
    def g():
        exec('print foo')
    g()
f()
Run Code Online (Sandbox Code Playgroud)

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

exec('global myvar\nmyvar = "changed!"')
Run Code Online (Sandbox Code Playgroud)

如果你能帮上忙,你不会真的想这样做。global已经不好了,而且exec本身就是一种代码气味!除非真的别无选择,否则您不会想要将它们组合起来。