【问题标题】:Python NameError in a function body函数体中的 Python NameError
【发布时间】:2021-02-08 02:24:13
【问题描述】:

我有两段 Python 代码,一段有效,另一段无效。


工作块:

env = {'user':'xyz'}
for key, value in env.items():
    exec("{} = value".format(key))

print(user)

输出:

xyz


该块不起作用:

def test():
    env = {'user':'xyz'}
    for key, value in env.items():
        exec("{} = value".format(key))

    print(user)

test()

输出:

NameError: name 'user' is not defined


我看到的唯一区别是第一个块是在全局范围内调用的。

你能解释一下吗?

非常感谢!

PS:恕我直言,我知道,我应该避免使用 exec(),但如果我想怎么办。

【问题讨论】:

  • 全局范围只是一个字典,可以通过exec或其他各种方式进行修改。但是函数的局部作用域在编译函数时是一成不变的(所有引用都变成了数组的索引),无法在运行时添加名称。
  • @jasonharper 谢谢,如果我打印 locals(),它会确认这个变量的存在:{'env': {'user': 'xyz'}, 'key': 'user', “价值”:“xyz”,“用户”:“xyz”}。你有什么想法?
  • 如上所述,它显示在 locals() 和调试器中,它显示为一个变量。为什么会这样? i.imgur.com/Ry1xoDX.png 当我尝试在下一行访问它时,它会引发异常。
  • 如果你真的需要使用exec(),那么就使用它——但我宁愿将它保留为字典env['user'] = ...,因为它比创建变量user = ...更有用
  • @furas 整个讨论的重点是我无法使用 exec()

标签: python nameerror python-exec


【解决方案1】:

我推荐你阅读this

您必须使用locals()execeval 在Python3 的函数中访问exec 定义的变量。

def test():
    env = {'user': 'xyz'}
    for key, value in env.items():
        exec("{} = value".format(key))
    exec("print(user)")
    print(locals()['user'])
    print(eval("user"))
 
test()

需要注意的是,如果您尝试存储从eval 返回的值。你会得到 NameError。

def test():
    env = {'user': 'xyz'}
    for key, value in env.items():
        exec("{} = value".format(key))
    user = eval("user")
    print(user)

test()

返回

Traceback (most recent call last):
  File "D:/Git/sscgc/test.py", line 8, in <module>
    test()
  File "D:/Git/sscgc/test.py", line 5, in test
    user = eval("user")
  File "<string>", line 1, in <module>
NameError: name 'user' is not defined

【讨论】:

  • 我也有类似的发现!!谢谢@david190810 分享这篇文章。很有帮助
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多