BETA

Python nonlocal変数

投稿日:2020-03-15
最終更新:2020-03-15

関数内からは外側の変数へ再代入ができない

メッセージを返すrtn_msg関数の中にはメッセージを生成するmake_msg関数がある
まずは内側の関数から外側の変数msgを出力してみる

def rtn_msg():  
    msg = 'Message:'  

    def make_msg():  
        print(msg)  

    make_msg()  

rtn_msg()  

変数msgの値が出力される

Message:  

次はmake_msg関数でメッセージを生成する

def rtn_msg():  
    msg = 'Message:'  

    def make_msg():  
        # 値の再代入がNG  
        msg += 'msg created!'  
        # 外側の変数を参照はできる  
        print(msg)  

    make_msg()  

rtn_msg()  

変数msgが宣言されてないよ!って感じですかね?

---------------------------------------------------------------------------  
UnboundLocalError                         Traceback (most recent call last)  
<ipython-input-26-93cfdcc0aa8e> in <module>  
     10     make_msg()  
     11   
---> 12 rtn_msg()  

<ipython-input-26-93cfdcc0aa8e> in rtn_msg()  
      8         print(msg)  
      9   
---> 10     make_msg()  
     11   
     12 rtn_msg()  

<ipython-input-26-93cfdcc0aa8e> in make_msg()  
      4     def make_msg():  
      5         # 値の再代入がNG  
----> 6         msg += 'msg created!'  
      7         # 外側の変数を参照はできる  
      8         print(msg)  

UnboundLocalError: local variable 'msg' referenced before assignment  

ここで nonlocal変数 を使う

def rtn_msg():  
    msg = 'Message:'  

    def make_msg():  
        # nonlocal宣言  
        nonlocal msg  

        msg += 'msg created!'  
        print(msg)  

    make_msg()  

rtn_msg()  

内側の関数で変数msgをnonlocal宣言してあげるとメッセージが生成できる!

Message:msg created!  

変数のスコープ意識しよう

これまで関数の外に引き継ぎたい値はself.変数に入れまくってたが
インスタンス変数汚染しちゃうので変数のスコープは最小限にするようにコーディングしよう!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう