inner functionを使うことがなかっためちょっと詰まったのでメモ程度に。
Inner Functionとは
Pythonでは以下のように関数の中に更に関数を定義することができる。
def method_a(): a = 100 print(a) # 100 def method_b(): b = 200 print(b) # 200
ネストされた関数から外部の変数の値を変更する
下のようなコードではmethod_b内にローカル変数aが存在していないためUnboundLocalErrorが返される。
def method_a(): a = 100 print(a) # 100 def method_b(): print(a) # <- NG
これを解決するにはnonlocal文を用いれば良いことがわかった。
公式ドキュメントを見るとこう書いてある。
nonlocal
文は、列挙された識別子がグローバルを除く一つ外側のスコープで先に束縛された変数を参照するようにします。これは、束縛のデフォルトの動作がまずローカル名前空間を探索するので重要です。この文は、中にあるコードが、グローバル (モジュール) スコープ以外のローカルスコープの外側の変数を再束縛できるようにします。
グローバルを参照したければ普通にglobal文使えばいいし、それ以外の一つ外側のスコープの変数を参照したければnonlocal文を使えばいいらしい。
def method_a(): a = 100 print(a) # 100 def method_b(): nonlocal a print(a) # 100 <- OK
Pythonのスコープに関してはまだよくわからない点も多いので近いうちにちゃんと理解しておきたい…..