【问题标题】:Python 3: Assign with Exec [duplicate]Python 3:使用 Exec 分配 [重复]
【发布时间】: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


【解决方案1】:
def myfunc():
    exec('a=3', locals(), globals())
    print('Result: a = {}'.format(a))


myfunc()

【讨论】:

  • 嗯,在第一种情况下可以,但在第二种情况下(当我把a=2放在首位时)结果仍然是Result: a = 2。看起来这在功能上等同于exec('globals()["a"]=3')
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 2017-11-26
  • 2012-06-06
  • 2018-10-22
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多