在探索有关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如何知道已经包含的变量的名称?
答案 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
字节码重新引用第一个单元格值。