【发布时间】: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