変数のスコープ

左辺と右辺でスコープが違うなんて…。やられた。

g_val = 0

def hoge(val):
    print "hoge: val = ", val
    g_val = val
    print "hoge: g_val = ", g_val

# テスト
print "old g_val =", g_val
hoge(1)
print "new g_val =", g_val

# 結果
old g_val = 0
hoge: val = 1
hoge: g_val = 1
new g_val = 0

左辺値は何も指定しないとスコープが関数内に閉じているって事か。hoge() の動作はこんな感じなんだろう。

  1. g_val に val を代入しようとするが関数スコープに g_val は存在しないので、ローカル変数 g_val を生成
  2. 生成したローカル変数 g_val に val を代入
  3. hoge() 関数から抜ける際にローカル変数 g_val が破棄される
  4. ああ、もう…。

んで変数のスコープがグローバルである事を示すには global を使用すれば良い、と。

def hoge(val):
    global g_val
    g_val = val

# テストの結果
old g_val = 0
new g_val = 1

ちゃんとした説明は Python ドキュメント6.13 global 文を読めって事で。