Python 3 ソース コードでスコープの分析を実行しようとしていますが、非ローカル ステートメント ステートメントがクラス定義内でどのように機能するかについて悩んでいます。
私が理解しているように、クラス定義はその本体を新しい名前空間内で実行し(dictと呼びます)、クラス名をタイプ(name、bases、dict)の結果にバインドします。非ローカル x は、外側の非ローカル スコープのどこかにバインドされている変数を参照している限り、機能するはずです。
これから、次のコードがコンパイルされて実行されることを期待しています。
class A:
v = 1
class B:
nonlocal v
v = 2
しかし、これは失敗します
SyntaxError: no binding for nonlocal 'v' found
次のコードは完全に実行されますが
def A():
v = 1
class B:
nonlocal v
v = 2
関数定義のクロージャとクラス定義の違いを説明できる人はいますか?