Python __closure__变量和单元格

时间:2012-09-05 14:56:13

标签: python python-3.x

在探索有关Python范围内部工作原理的一些解决方案to my previous question时,我了解了__closure__属性。似乎Python使用此属性从嵌套函数中访问外部作用域中定义的变量。

我们可以通过以下方式看到这一点:

def foo():
    x = 5
    def bar(): 
        print(x)
        print(*(cell.cell_contents for cell in bar.__closure__))
    bar()
foo()

这会显示两个包含的值,5和函数bar本身。

我不明白 这是如何工作的 - 因为__closure__属性只包含一个存储所附的单元格元组。但是没有关于所附变量名称的信息 - (即单元格存储在tuple中,而不是dict中。那么Python如何知道已经包含的变量的名称?

1 个答案:

答案 0 :(得分:8)

python编译的代码使用索引;变量与单元格结构的索引相关联。

>>> def foo():
...     x = 5
...     def bar():
...         return x
...     return bar
... 
>>> bar = foo()
>>> import dis
>>> dis.dis(bar)
  4           0 LOAD_DEREF               0 (x) 
              3 RETURN_VALUE         

LOAD_DEREF字节码重新引用第一个单元格值。