4

Pythonスコープの内部動作に関する以前の質問に対するいくつかの解決策を検討しているときに、__closure__属性について学びました。Pythonはこの属性を使用して、ネストされた関数内から外部スコープで定義された変数にアクセスしているようです。

次の手順を実行することで、これが実際に動作していることを確認できます。

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

これは、2つの囲まれた値5と、関数bar自体を示しています。

私が理解していないのは、これがどのように機能するかです。属性には、囲まれた__closure__を格納するセルのタプルが含まれているだけだからです。ただし、囲まれた変数名に関する情報はありません-(つまり、セルはではなく、に格納されます)。では、Pythonはどのようにして囲まれた変数の名前を知るのでしょうか?tupledict

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 に答える