python - 在函数内调用 exec - NameError

标签 python

为什么这段代码会引发 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 function exec() returns.

关于python - 在函数内调用 exec - NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72805761/

相关文章:

python - 如何使用提供的方法标准化n个不同的数据集,该方法只能标准化一组数据

python - 将文件属性保留在副本上

python - 在 python 中解码 HTTP 数据包内容,如 wireshark 中所见

python - Fdist 和前 10 个功能词

python - 包装器方法的意义是什么?

python - 如何访问管道中包含的模型中的最佳估计器参数?

python - 执行 python 脚本并在 WXPython GUI 中显示进度

python - 使用 Cython 时,可以替代在 PySpark mapPartitions 中使用嵌套函数吗?

python如何在模块中注册动态类

Python 相当于 ruby​​ 的 __method__?