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 という例外を発生してプログラムが終了します。
スコープを股がって変数を利用する際には注意が必要ですね……。

# -*- coding: utf-8 -*-

#global変数
hoge = "hoge"

def func1():
    return hoge + " return by func1"

def func2(value):
    #ここではローカルで hoge が利用される可能性があるので、
    #hogeはローカル変数として割り当てられている
    if value == 3:
        hoge = "value is 3"
    return hoge

print func1() #成功
print func2(3) #成功
print func2(2) #hoge がなくて、失敗

0 件のコメント:

コメントを投稿