Python3:assignwithexec
首先,是的,我知道我做的不好。这是一个黑客项目的一部分,我只是想找点乐子 在Python 2.7中,可以执行以下操作: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')
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()