Python 3.3.1 では、次のように動作します。
i = 76
def A():
global i
i += 10
print(i) # 76
A()
print(i) # 86
これも機能します:
def enclosing_function():
i = 76
def A():
nonlocal i
i += 10
print(i) # 76
A()
print(i) # 86
enclosing_function()
しかし、これはうまくいきません:
i = 76
def A():
nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"
i += 10
print(i)
A()
print(i)
nonlocal
キーワード状態のドキュメント(強調を追加):
非ローカル ステートメントにより、リストされた識別子は、最も近い外側のスコープ内の以前にバインドされた変数を参照します。
3 番目の例では、「最も近いエンクロージング スコープ」がたまたまグローバル スコープになっています。では、なぜうまくいかないのでしょうか。
このビットを読んでください
ドキュメントが次のように続くことに気付きました(強調を追加):
[ ] ステートメントにより、カプセル化されたコードは、グローバル (モジュール) スコープ以外
nonlocal
のローカル スコープ外の変数を再バインドできます。
しかし、厳密に言えば、これは、3 番目の例で行っていることがうまくいかないという意味ではありません。