青岛建设网站的公司,网站系统建设费用,二次开发教程,北京低价网站建设LOAD_DEREF 是 Python 字节码指令#xff0c;它与闭包和嵌套函数有关。要理解 LOAD_DEREF#xff0c;我们首先需要了解 Python 中的几个概念#xff1a;cell、free variable 和闭包。 Cell 和 Free Variables: 当一个嵌套函数引用了其上级作用域中的一个变量#xff0c;但该…LOAD_DEREF 是 Python 字节码指令它与闭包和嵌套函数有关。要理解 LOAD_DEREF我们首先需要了解 Python 中的几个概念cell、free variable 和闭包。 Cell 和 Free Variables: 当一个嵌套函数引用了其上级作用域中的一个变量但该变量并不是全局的或局部的那么这个变量就被称为 free variable。cell 是一个内部机制用于存储这些 free variables使嵌套函数可以访问它们即使上级函数已经退出。 闭包 (Closure): 在 Python 中函数是一等对象这意味着它们可以作为参数传递可以返回可以定义在另一个函数内部等。当内部函数引用了外部函数的变量时我们得到了一个闭包。闭包捕获并保存了外部函数的 free variables使得这些变量即使在外部函数结束后仍然可以被访问。
LOAD_DEREF 指令就是在闭包中使用的用于加载从一个 cell 或 free variable 中的值到栈上。具体来说它用于加载由 cell 或嵌套函数作用域中的局部变量表示的值。
让我们看一个简单的示例
def outer(x):def inner():return xreturn innerfunc outer(10)
print(func()) # 输出: 10在上述示例中inner 函数是一个闭包因为它引用了外部函数 outer 的变量 x。当我们调用 outer 并返回 inner 时变量 x 的值仍然被保存下来这就是通过 cell 机制实现的。当 inner 函数执行并尝试访问 x 时就会使用 LOAD_DEREF 指令。
如果你查看 inner 函数的字节码你会看到 LOAD_DEREF 指令。这可以通过以下方式完成
import dis
dis.dis(func)在如下输出中我们看到 LOAD_DEREF 指令表示它正在从一个 cell 或 free variable 加载一个值。 6 0 LOAD_DEREF 0 (x)2 RETURN_VALUE接下来让我们看看 free variable 和 cell 的例子。 Free Variable: free variable 是一个在嵌套函数内部被引用但不是这个嵌套函数的局部变量也不是全局变量的变量。在以下示例中x 就是一个 free variable 对于 inner 函数来说。 def outer():x 10 # 这里的 x 就是一个 free variable 对于 inner 来说def inner():print(x) # x 在这里被引用但它既不是 inner 的局部变量也不是一个全局变量inner()outer() # 输出: 10Cell: 当我们谈论闭包时Python 使用 cell 对象来实现这个特性。这是因为尽管上层函数已经执行完毕并退出了但嵌套的函数依然可以访问上层函数的变量。这就是通过将这些变量保存在 cell 对象中来实现的。 在以下示例中我们创建了一个闭包然后使用 __closure__ 属性来查看这些 cell 对象 def outer(x):def inner():return xreturn innerclosure_function outer(25)
print(closure_function()) # 输出: 25# 查看 closure_function 的 cell 对象
cell closure_function.__closure__[0]
print(cell.cell_contents) # 输出: 25cell 对象有一个属性 cell_contents它保存了闭包中被引用的变量的当前值。在上面的例子中cell.cell_contents 的值是 25这是我们传递给 outer 函数的值。 【注】print(closure_function._ _closure _ _) 的输出为 (cell at 0x00000223E8C3A6B0: int object at 0x00000223E8AD03F0,)