在模块级别声明的函数从不具有闭包,并通过LOAD_GLOBAL
访问非局部变量。
在模块级声明为而非的函数可能具有闭包,并且如果这些变量不是全局的,则可以通过LOAD_DEREF
访问非本地变量。
因此,基本上我们有三种存储和加载变量GLOBAL
(全局)、FAST
(局部)和DEREF
(非局部、封闭、覆盖)的方法。
为什么选择GLOBAL
?如果让所有函数都有闭包,那么FAST
和DEREF
就足够了吗?非局部变量和我没有发现的全局变量之间有什么重要的区别吗?这可能是由于性能问题,因为全局变量(就像在模块级别定义的所有函数和类(包括它们的方法)加上内置变量)通常比非局部变量更常见吗?
在编译期间枚举本地和封闭名称。在运行时,它们存储在C数组中,并使用整数/索引进行访问。CCD_ 9和CCD_。
全局名称不能在编译时枚举,它们可以在运行时由整个过程中的任何代码添加和删除。这类似于对象属性,因为全局元素本质上是模块对象的属性。因此,它们存储在字典中,实现对它们的访问与本地和封闭名称截然不同。LOAD_GLOBAL
取一个字符串(常量)并执行字典查找。