python - 全局变量的实现与取消引用的变量

标签 python global-variables closures

在模块级别声明的函数永远不会有闭包并通过 LOAD_GLOBAL 访问非局部变量。

在模块级别声明的函数可能有一个闭包并通过LOAD_DEREF访问非局部变量(如果这些变量不是全局变量)。

所以基本上我们有三种存储和加载变量的方法GLOBAL(全局),FAST(本地)和DEREF(非本地) ,封闭,覆盖)。

为什么是 GLOBAL?如果让所有函数都有闭包,FASTDEREF 还不够吗?我没有发现非局部变量和全局变量之间有什么重要区别吗?这可能是由于性能问题,因为全局变量(如在模块级别定义的所有函数和类(包括它们的方法)加上内置函数)通常比非局部变量更常见?

最佳答案

本地名称和封闭名称在编译期间被枚举。在运行时,它们存储在 C 数组中并使用整数/索引访问。 LOAD_FASTLOAD_DEREF 采用 C 整数并执行 C 数组查找。

全局名称不能在编译时枚举,它们可以在运行时由整个过程中的任何代码添加和删除。这类似于对象属性 - 因为全局变量本质上是 模块对象的属性。因此,它们存储在字典中,实现访问它们的方式与本地名称和封闭名称完全不同。 LOAD_GLOBAL 接受一个字符串(常量)并执行字典查找。

关于python - 全局变量的实现与取消引用的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440163/

相关文章:

python - Sympy:在有限域中求解矩阵

JavaScript - 使用 Webpack 管理全局变量

python - 在函数中绑定(bind)对象值(闭包)

python - 全局安装 PyPy Ubuntu

python - 如何为 subprocess.call 创建自定义输出流

Java泛型分配全局变量

ios - Swift 1.2 - 由类函数的闭包参数引起的错误

rust - 闭包返回类型的生命周期规范

python - 基于ID的累积SUM

swift - 如何在swift中实现单例