NameError: name 'x' is not defined の原因と直し方
定義していない変数を参照したときに出る、最も頻出のエラーの一つです。タイプミス・宣言忘れ・似た名前との混同のパターンを整理します。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
NameError- 例外クラス — 何が起きたか。ここを検索するのが最短です
name 'cout' is not defined. Did you mean: 'count'?- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 count = 10 2 print(cout ) ^
C++のcoutとの混同や単純な打ち間違いで起きます。似た名前の変数が定義されていると、Pythonが候補を提示してくれます。
直し方: cout を count にします。
パターン2
1 x = 5 2 print(y ) ^
定義されていない名前を参照すると発生します。似た名前が存在しない場合は「Did you mean」の提案も出ません。
直し方: y を x にします。
パターン3
1 price = 100 2 tax_rate = 0.1 3 print(price + tex_rate) ^
スネークケースの変数名はタイプミスに気づきにくいです。1文字違いでも別の名前として扱われます。
直し方: tex_rate を tax_rate にします。
パターン4
1 total = 50 2 discount = 5 3 print(total - discont ) ^
母音の抜けたタイプミスです。似た名前の変数が定義されているので、Pythonが候補を提示してくれます。
直し方: discont を discount にします。
パターン5
1 message = "hi" 2 print(msg ) ^
略した名前で参照すると、元の変数名とは別物として扱われます。似た名前が存在しないため候補も出ません。
直し方: msg を message にします。
よくある誤解
似た名前の変数が定義されているとき、Pythonは「Did you mean」で候補を提示してくれますが、常に出るわけではありません。似た名前が存在しない完全な打ち間違いでは出ないので、油断できません。
実務での勘所
Pythonが変数名を探す順序はLEGBルール(Local→Enclosing→Global→Built-in)と呼ばれ、まず一番内側の関数のローカル、次に外側の関数、次にモジュール全体のグローバル、最後にlenやprintのような組み込み名の順で探します。NameErrorは、この4段階のどこにもその名前が見つからなかったときに初めて発生します。関数の中で外側の変数を書き換えるつもりで代入すると、Pythonはそれをローカル変数の新規作成と解釈するため(UnboundLocalErrorのトピックで扱っています)、LEGBの探索順を知っておくと原因の切り分けが速くなります。