2010年8月9日月曜日

pythonの変数

昔読んだ python 本で変数の説明について、pythonはスコープの狭い方から評価される、という記述を見かけたのですが、それをすっかり忘れていて、その法則を久々思い出すパターンにハマったので、メモ代わりに記事にしておこうかと思います。

以下のソースでは、Line 4 でグローバルスコープの hoge を宣言して、関数 func1, func2 で参照しています。

ただし func2 では func2 の関数中で value == 3 の場合、変数 hoge への代入を行っています。

この代入があるせいで func2 内では hoge は func2 のローカル変数になります。
python のソースがバイトコードに変換される際に func2 内の hoge はローカル変数として予約されるので value == 2 のように if 文を通過しない際には func2 内で hoge が宣言されず UnboundLocalError: local variable 'hoge' referenced before assignment という例外を発生してプログラムが終了します。
スコープを股がって変数を利用する際には注意が必要ですね……。

  1. # -*- coding: utf-8 -*-  
  2.   
  3. #global変数  
  4. hoge = "hoge"  
  5.   
  6. def func1():  
  7.     return hoge + " return by func1"  
  8.   
  9. def func2(value):  
  10.     #ここではローカルで hoge が利用される可能性があるので、  
  11.     #hogeはローカル変数として割り当てられている  
  12.     if value == 3:  
  13.         hoge = "value is 3"  
  14.     return hoge  
  15.   
  16. print func1() #成功  
  17. print func2(3#成功  
  18. print func2(2#hoge がなくて、失敗  

0 件のコメント:

コメントを投稿