【发布时间】:2019-11-12 20:34:28
【问题描述】:
首先,是的,我知道我做的很糟糕。这是我正在尝试的一个 hacky 项目的一部分。
在 Python 2.7 中,您可以这样做:
def myfunc():
exec('a=3')
print('Result: a = {}'.format(a))
myfunc()
然后得到Result: a = 3
在 Python 3.6 中并非如此,您将获得 NameError: name 'a' is not defined。
我可以尝试通过以下方式解决这个问题:
def myfunc():
exec('globals()["a"]=3')
print('Result: a = {}'.format(a))
myfunc()
在 Python 3.6 中提供了所需的 Result: a = 3(是的,通过修改全局变量会产生危险的后果)。但在以下情况下它当然会失败:
def myfunc():
a=2
exec('globals()["a"]=3')
print('Result: a = {}'.format(a))
myfunc()
我在哪里得到Result: a = 2。在这里交换exec('a=3') 也会得到Result: a = 2。
问题:Python 3 中是否有任何 hack 可以有效地让我分配给函数体中的变量?
【问题讨论】:
-
没有。没有好的或简单的方法。但好消息是您不需要这样做。
-
exec('globals()["a"]=3')简直是疯了。你应该做globals()['a'] = 3。无论如何,只需传递一个自定义命名空间,例如一些dict作为本地人然后使用字典提取变量。这会起作用。
标签: python python-3.x