Python3:assignwithexec

Python3:assignwithexec,python,python-3.x,Python,Python 3.x,首先,是的,我知道我做的不好。这是一个黑客项目的一部分,我只是想找点乐子 在Python 2.7中,可以执行以下操作: def myfunc(): exec('a=3') print('Result: a = {}'.format(a)) myfunc() 并得到结果:a=3 在Python3.6中并非如此,您将得到NameError:name'a'未定义 我可以尝试通过以下方式解决此问题: def myfunc(): exec('globals()["a"]=3')

首先,是的,我知道我做的不好。这是一个黑客项目的一部分,我只是想找点乐子

在Python 2.7中,可以执行以下操作:

def myfunc():
    exec('a=3')
    print('Result: a = {}'.format(a))

myfunc()
并得到
结果:a=3

在Python3.6中并非如此,您将得到
NameError:name'a'未定义

我可以尝试通过以下方式解决此问题:

def myfunc():
    exec('globals()["a"]=3')
    print('Result: a = {}'.format(a))

myfunc()
在Python3.6中,它给出了所需的
结果:a=3
(是的,修改globals会产生危险的后果)。但在以下情况下,它当然会失败:

def myfunc():
    a=2
    exec('globals()["a"]=3')
    print('Result: a = {}'.format(a))

myfunc()
我得到的
结果是:a=2
。在
exec('a=3')
中进行交换也会得到
结果:a=2


问题:Python 3中有没有任何黑客可以有效地允许我在函数体中指定一个变量?

嗯,在第一种情况下可以,但是在第二种情况下(当我将
a=2
放在第一位时),结果仍然是
result:a=2
。看起来这在功能上等同于
exec('globals()[“a”]=3')
No。没有一个好的或简单的方法。但好消息是你不需要这样做。
exec('globals()[“a”]=3')
简直是疯了。您只需执行
globals()['a']=3
。无论如何,只需传递一个自定义名称空间,例如一些
dict
作为局部变量,然后使用dict提取变量,这将起作用。
def myfunc():
    exec('a=3', locals(), globals())
    print('Result: a = {}'.format(a))


myfunc()