为什么这段代码会引发 NameError
?:
def func():
exec("my_var = 42")
print(my_var)
func()
有很多相关的问题,但我还没有找到关于为什么的明确答案。我不想要解决方法。
此外,我注意到代码在我运行时有效:
exec("my_var = 42", globals(), globals())
但不太确定为什么。
documentation for exec() 声明:“...如果省略可选部分 [第二和第三个参数],则代码在当前范围内执行。”。当前作用域是 func() 函数。为什么我不能从同一范围访问 my_var?
最佳答案
解析器/编译器不考虑 exec()
的参数(因为它可能是一个变量)。因此,当它解析函数时,它看不到对 my_var
的赋值,因此它将它视为全局变量。但是 exec()
中的赋值会创建一个局部变量。因此,分配的变量与它尝试打印的变量不同。
此外,如果您希望对局部变量的更改可见,则必须显式传递 locals()
字典。 [文档] 指出:
Note: The default locals act as described for function
locals()
below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after functionexec()
returns.
关于python - 在函数内调用 exec - NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72805761/