関数内の関数で値の変更が期待できそうだが、変更できないことがある。少し複雑な表現だが、コードで確認する。
def f():
x = 42
print(x) # 42
def inner_f():
x = 0 # この0はローカルでf()にある x には代入されない
print(x) # 0
inner_f()
print(x) # 42
f()
nonlocal 宣言
以下のように、nonlocalを宣言することでその変数へアクセスできるようになる。
def f():
x = 42
print(x) # 42
def inner_f():
nonlocal x
x = 0
print(x) # 0
inner_f()
print(x) # 0
f()