global 文は、一番外側の変数を参照します。
nonlocal 文は、関数のひとつ外側の変数を参照します。
#
# 対話モード >>> に
# コピペで実行できます。
#
間隔 = 0 # <--- global 文は、一番外側の変数を参照します。
def カウンターを作る():
現在の値 = 0 # <--- nonlocal 文は、関数のひとつ外側の変数を参照します。
def カウントする():
global 間隔
nonlocal 現在の値
現在の値 = 現在の値 + 間隔
return 現在の値
return カウントする
カウントする = カウンターを作る()
# 間隔 = 0 なので 0 のまま
カウントする()
カウントする()
カウントする()
# 間隔 = 1 を設定すると 1 ずつ増える。
間隔 = 1
カウントする()
カウントする()
カウントする()
>>> # 間隔 = 0 なので 0 のまま
>>> カウントする()
0
>>> カウントする()
0
>>> カウントする()
0
>>>
>>> # 間隔 = 1 を設定すると 1 ずつ増える。
>>> 間隔 = 1
>>> カウントする()
1
>>> カウントする()
2
>>> カウントする()
3
>>>
関数の中で定義する関数の使いどころとしては、他にも「デコレータ」と「カリー化, 部分的適用」があります。