4

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

我们可以通过执行以下操作来看到这一点:

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

这显示了两个封闭的值5和函数bar本身。

我不明白这是如何工作的 - 因为,该__closure__属性仅包含一个存储封闭的单元格元组。但是没有关于封闭变量名称的信息- (即单元格存储在 a 中tuple,而不是 a dict)。那么 Python 是如何知道被括起来的变量的名称的呢?

4

1 回答 1

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字节码引用第一个单元格值。

于 2012-09-05T14:58:08.167 回答