Search code examples
pythonexecglobal

Cannot change global variables in a function through an exec() statement?


Why can I not change global variables from inside a function, using exec()? It works fine when the assignment statement is outside of exec(). Here is an example of my problem:

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

Solution

  • Per the docs, the exec statement takes two optional expressions, defaulting to globals() and locals(), and always performs changes (if any) in the locals() one.

    So, just be more explicit/specific/precise...:

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

    ...and you'll be able to clobber global variables to your heart's contents.