関数内でグローバル変数を更新できない(globalキーワード忘れ)
関数の中で変数に代入すると、その変数は既定でローカル変数になります。外側の変数を更新したいときはglobal宣言が必要です。
なぜエラーが出ないのか
出力: 0
(エラーなし)- Pythonは何も報告しません。文法として正しいためです
出力: 0- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 count = 0 2 3 def set_count(n): 4 ^ 5 count = n 6 7 set_count(5) 8 print(count)
出力: 0期待: 5 (エラーにはなりません)
global宣言が無いと、count = n は関数内だけの新しいローカル変数を作るだけです。外側のcountは変わらないまま残ります。
直し方: (空) を global count にします。
広告
広告スロット(未設定)
パターン2
1 balance = 100 2 3 def deposit(amount): 4 ^ 5 balance = amount 6 7 deposit(500) 8 print(balance)
出力: 100期待: 500 (エラーにはなりません)
関数内のbalanceはグローバルとは別の変数として扱われます。呼び出し後も外側の値は変わりません。
直し方: (空) を global balance にします。
パターン3
1 status = "idle" 2 3 def start(): 4 ^ 5 status = "running" 6 7 start() 8 print(status)
出力: idle期待: running (エラーにはなりません)
文字列の状態管理でも同じです。関数内での代入は既定でローカル変数を作るだけなので、global宣言をしない限り外の変数には反映されません。
直し方: (空) を global status にします。
よくある誤解
エラーは一切出ません。関数は正常に実行され、意図した処理をしたように見えますが、外側の変数は変わらないままという、気づきにくい種類のバグです。
まとめ
関数内でグローバル変数を更新できない(globalキーワード忘れ)は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。