Pythonのネストされた関数から外部の変数の値を参照する

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のスコープに関してはまだよくわからない点も多いので近いうちにちゃんと理解しておきたい…..

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA