【问题标题】:Command exec in a function, name error - python3函数中的命令执行,名称错误 - python3
【发布时间】:2021-08-25 03:30:20
【问题描述】:

我是 Python 的初学者,但我遇到了一个我无法理解的问题。我试图用 exec() 定义一个变量,然后打印它。它运作良好。但是当我在函数中执行相同的代码时,它不起作用......

例子:

def fonct():
    possibilite = [0,1,2,3]
    testc = 0
    testl = 1
    commande = "proba"+str(testc+1)+str(testl)+" = possibilite"
    exec(commande)
    print(commande)
    print(proba11)

同样的事情,但在函数中没有结果,命令 print(proba11) 返回 [0,1,2,3] 所以它工作。但对于我得到这个的例子:

proba11 = possibilite
NameError: name 'proba11' is not defined

没有关于全局或本地的故事,一切都是本地的......

【问题讨论】:

  • 没有名为 proba11 的变量,这就是您出现此错误的原因。首先,如果要打印,定义proba11
  • 但是当我执行相同的代码时,没有定义 proba11 但不在函数中它正在工作。所以我想不定义也可以,我试试,谢谢。
  • proba11 = possibilite 是因为这个代码commande = "proba"+str(testc+1)+str(testl)+" = possibilite" 而出现的。它只是一个字符串,不是变量
  • 所以不能打印出来
  • 好吧,我试过了,在函数的第一行,我写了proba11 = [0]。并且 print(proba11) 返回 [0] 而不是 [0,1,2,3] .... 所以我认为 exec() 没有按预期工作,但我不知道为什么...我用过在其他条件下,这是我遇到问题的唯一地方......

标签: python python-3.x function exec python-exec


【解决方案1】:

由于局部变量的存储方式,在 Python 3 中使用 exec() 更新局部变量非常棘手。它曾经在 Python 2.7 及更早版本中工作。

要解决此问题,您需要

  • 将明确的locals 字典传递给exec
  • 从更新的本地字典中获取新定义的变量

像这样:

def fonct():
    possibilite = [0, 1, 2, 3]
    testc = 0
    testl = 1
    varname = "proba" + str(testc + 1) + str(testl)
    commande = varname + " = possibilite"
    _locals = locals()
    exec(commande, globals(), _locals)
    proba11 = _locals[varname]
    print(proba11)

按预期工作。

您可以在此处阅读更多信息:

【讨论】:

  • 非常感谢!这只是一个不知道的技巧,谢谢你教我这个!
猜你喜欢
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多