Code Fix

初級

NameError: Did you mean 'True'? の原因と直し方

True・False・Noneの大文字小文字を間違えたときに出るエラーです。変数名の大文字小文字の食い違いでも同じ形のエラーになります。

エラーメッセージの読み方

Traceback (most recent call last):
main.py
ファイル名
1
行番号 — 実際にクラッシュした行
<module>
発生場所 — <module> ならトップレベル、関数名ならその関数の中
NameError
例外クラス — 何が起きたか。ここを検索するのが最短です
name 'true' is not defined. Did you mean: 'True'?
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  flag = true
             ^
Traceback (most recent call last): File "main.py", line 1, in <module> flag = true ^^^^ NameError: name 'true' is not defined. Did you mean: 'True'?

Pythonの真偽値はTrue/Falseで、先頭が大文字です。他言語のtrue/falseの癖のまま書くとNameErrorになります。

直し方: true を True にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  x = none
          ^
Traceback (most recent call last): File "main.py", line 1, in <module> x = none ^^^^ NameError: name 'none' is not defined. Did you mean: 'None'?

PythonにはnullやNULLはなく、Noneという名前の唯一のオブジェクトです。大文字小文字を含めて正確に書く必要があります。

直し方: none を None にします。

この問題を解いてみる →

パターン3

 1  Total = 100
 2  print(total )
             ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(total) ^^^^^ NameError: name 'total' is not defined. Did you mean: 'Total'?

Pythonの変数名は大文字小文字を区別します。定義したときと違う大文字小文字で参照すると別の名前として扱われます。

直し方: total を Total にします。

この問題を解いてみる →

パターン4

 1  done = FALSE
             ^
Traceback (most recent call last): File "main.py", line 1, in <module> done = FALSE ^^^^^ NameError: name 'FALSE' is not defined. Did you mean: 'False'?

全部大文字のFALSEもNameErrorになります。正しい綴りはFalseで、先頭だけ大文字です。

直し方: FALSE を False にします。

この問題を解いてみる →

パターン5

 1  Price = 500
 2  print(price )
             ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(price) ^^^^^ NameError: name 'price' is not defined. Did you mean: 'Price'?

先頭を大文字にして定義した変数名も、参照時に全部小文字だと別名として扱われます。

直し方: price を Price にします。

この問題を解いてみる →

よくある誤解

他の言語のtrue/false/nullの綴りのままPythonを書くと、これらは「定義されていない変数」として扱われます。予約語ではなく組み込み定数の大文字小文字の話だと気づきにくいポイントです。

実務での勘所

True・False・Noneは現在では正真正銘の予約語ですが、実はPython 2の時代には単なる組み込み変数の扱いで、True = 1のように再代入することさえ文法上は可能でした(推奨はされていませんでした)。Python 3でこれらは正式な予約語に格上げされ、再代入しようとするとSyntaxErrorになるよう変更されています。綴りを間違えると予約語ではなく「定義されていない変数」として扱われるのは、これらが特別な構文ではなく名前として認識される組み込み定数だからです。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)