Python ERROR
Python NameError: name is not defined の解決法
使おうとした名前(変数・関数)が定義されていないときのエラーです。スペルミスと定義順が主な原因です。
このエラーメッセージ
NameError: name 'mesage' is not defined
原因
- 変数名・関数名のスペルミス
- 変数を定義する前に使っている
- 文字列のクォートを付け忘れている
❌ エラーになるコード
NG
message = "Hello"
print(mesage)
✅ 修正したコード
OK
message = "Hello"
print(message)
▶ 修正済みコードを実行エディタで開く
progoのPython実行環境(インストール不要・登録不要)でその場で動作を確認できます。
解決のポイント
エラーメッセージに出ている名前と、定義した名前が一致しているか確認します。大文字小文字も区別されます(Messageとmessageは別物)。また、変数は使う前に代入しておく必要があります。
原因を1つずつ確認する
- スペルミス・大文字小文字 …
mesage/Message。エラーの '...' 内の名前をそのまま検索して定義箇所と照合。
- 定義する前に使っている … 上から下へ実行されるので、変数への代入・関数呼び出しより前でその名前を使うと未定義。
- 文字列のクォート忘れ …
print(hello) は変数 hello を探す。文字列なら print("hello")。
- import 忘れ/呼び方違い …
import math なら math.sqrt()、from math import sqrt なら sqrt()。
- 別ファイル・別セル … Jupyterでセルを実行し忘れ、対話モードを閉じた後など。
- Python2の書き方 …
print "x" は3では構文エラー、raw_input は input に。
関数の中だけで NameError(スコープ)
関数の外で定義した変数は関数の中から読むことはできますが、関数の中で定義した変数は外からは見えません。
def show():
msg = "hello"
show()
print(msg) # NameError: name 'msg' is not defined
関数の結果を外で使いたいときは return で返します。
▶ return で値を返すコードを実行エディタで開く
progoのPython実行環境(インストール不要・登録不要)でその場で確認できます。
NameError と UnboundLocalError の違い
関数内で同じ名前に代入があると、その名前は関数のローカル変数扱いになります。代入より前に読むと UnboundLocalError: local variable 'x' referenced before assignment(NameErrorのサブクラス)になります。外の変数を書き換えたい場合は関数の先頭で global x と宣言します。
よくある質問
関数の中で外の変数が見えない
関数内で代入すると別のローカル変数になります。読むだけなら参照できますが、書き換えるにはglobalやreturnを検討します。
importしたのにNameError
import module した場合は module.func() のように呼びます。from module import func なら func() で呼べます。
name 'true' is not defined と出る
Pythonの真偽値は先頭大文字の True / False / None です。小文字で書くと未定義の名前として NameError になります。
UnboundLocalError との違いは?
その名前がどこにも無いのが NameError、関数内で代入があるのに代入前に読んだのが UnboundLocalError です。外の変数を書き換えたいなら global 宣言します。
print("x") でエラーになる
print "x" のようにカッコ無しで書くと Python3 では構文エラー、変数を渡すつもりの print(x) は x が未定義だと NameError です。文字列はクォートで囲みます。