変数のスコープ
左辺と右辺でスコープが違うなんて…。やられた。
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() の動作はこんな感じなんだろう。
- g_val に val を代入しようとするが関数スコープに g_val は存在しないので、ローカル変数 g_val を生成
- 生成したローカル変数 g_val に val を代入
- hoge() 関数から抜ける際にローカル変数 g_val が破棄される
- ああ、もう…。
んで変数のスコープがグローバルである事を示すには global を使用すれば良い、と。
def hoge(val): global g_val g_val = val # テストの結果 old g_val = 0 new g_val = 1
ちゃんとした説明は Python ドキュメントの 6.13 global 文を読めって事で。