NameError: name '〇〇' is not defined の意味と直し方

Last Updated on 2025年7月28日

NameError: name '〇〇' is not defined の意味と直し方

NameError: name '〇〇' is not defined の意味と直し方

Pythonでプログラムを書いていると、実行時に遭遇するエラーは避けられないものです。その中でも、特に頻繁に目にするのがNameError: name '〇〇' is not definedというエラーメッセージでしょう。このメッセージを見ると、「あれ、この変数、ちゃんと書いたはずなのに…」と首をかしげてしまう方もいるかもしれません。特に、iPhoneなどのモバイル環境でサッとコードを書いて試す際など、ちょっとした入力ミスや考慮漏れが原因で、このエラーは頻繁に顔を出します。

NameErrorは、Pythonインタプリタがあなたのコードの中で「〇〇」という名前(変数名、関数名、クラス名、モジュール名など)を見つけられなかったときに発生します。まるで、友達に「田中さんに電話して!」と頼んだのに、あなたの周りに田中さんが存在しない、あるいは誰が田中さんなのかわからない、といった状況に似ています。コードの文法自体は正しいにもかかわらず、参照しようとした「名前」がどこにも定義されていないことが、このエラーの根本原因なのです。

この記事では、NameErrorが具体的にどのようなエラーなのか、なぜ発生するのか、そしてiPhoneの小さな画面でも確認しやすい効果的な対処法を、豊富なコード例を交えながら徹底的に解説します。さらに、NameErrorと混同されやすいAttributeErrorTypeErrorなど、他のよくあるエラーとの違いについても触れることで、エラーメッセージの正確な読み解き方を身につけ、より効率的にデバッグを進めるための知識を提供します。この記事を読み終える頃には、あなたはNameErrorの発生原因を瞬時に特定し、自信を持ってコードを修正できるようになっていることでしょう。

目次

エラー内容

Pythonでプログラムを実行した際に、以下のような形式で表示されるのがNameError: name '〇〇' is not definedです。

File "my_script.py", line 3, in <module>
print(my_variable)
NameError: name 'my_variable' is not defined

また、関数を呼び出そうとした場合や、モジュール内の機能を使おうとした場合にも表示されます。

File "another_script.py", line 7, in process_data
result = calculate_value(data)
NameError: name 'calculate_value' is not defined

このエラーメッセージは、Pythonインタプリタがあなたのコードを上から順に読み込み、実行している最中に、特定の「名前」に遭遇したものの、それが「何であるか」をまだ知らない、あるいはもはや知ることができないと判断したときに発生します。つまり、その「名前」が定義されていない、という意味です。

エラーメッセージに含まれる情報は以下の通りです。

  • File "my_script.py" (または "another_script.py"): エラーが発生したファイル名です。
  • line 3 (または line 7): エラーが検出された具体的な行番号です。この行に問題があることが多いです。
  • in <module> (または in process_data): エラーが発生した場所を示します。<module>はスクリプトの最上位レベル(グローバルスコープ)を意味し、process_dataのような関数名が表示される場合は、その関数内でエラーが発生したことを示します。
  • print(my_variable) (または result = calculate_value(data)): エラーが発生した行のコードです。
  • NameError: name 'my_variable' is not defined (または NameError: name 'calculate_value' is not defined): エラーの種類とその内容です。引用符で囲まれた「〇〇」の部分が、Pythonが見つけられなかった名前を示しています。

NameErrorは、コードの書き方(文法)自体が間違っていることを示すSyntaxErrorとは異なり、コードの論理的な構造や実行順序に起因することが多いです。例えば、変数を使う前にその変数に値を代入していなかったり、定義した関数を呼び出す前にその定義が読み込まれていなかったりする場合に発生します。iPhoneのテキストエディタでコードを書く場合、特にコードが長くなると、定義済みの変数や関数を記憶するのが難しくなり、このようなエラーに遭遇しやすくなります。

このエラーメッセージが表示されたら、まず最初に引用符で囲まれた名前(上記例ではmy_variablecalculate_value)が、コードのどこかで正しく定義されているか、そしてその定義がエラーの発生箇所よりも「前」にあるかを確認することがデバッグの出発点となります。

原因

NameError: name '〇〇' is not definedは、Pythonインタプリタが指定された「名前」(変数、関数、クラス、モジュールなど)を、現在の実行コンテキスト内で見つけられないときに発生します。これは、コードの文法そのものではなく、その「意味」や「存在」に関する問題です。以下に、このエラーが引き起こされる主な原因を詳しく解説します。

1. 名前のスペルミス・大文字小文字の違い

最も単純で、かつ頻繁に発生する原因の一つが、変数名や関数名などのスペルミスです。Pythonは厳密に大文字と小文字を区別する言語(ケースセンシティブ)です。例えば、myVariableと定義したのに、myvariableと呼び出すと、Pythonは別の名前だと判断し、NameErrorを発生させます。

iPhoneのソフトウェアキーボードで入力していると、自動修正機能や、うっかり別の文字を入力してしまうことで、スペルミスが発生しやすくなります。また、キャメルケース(myVariableName)やスネークケース(my_variable_name)など、命名規則が混在していると、さらに間違いが増える可能性もあります。

# 悪い例: 変数名のスペルミス
user_name = "Alice"
print(uer_name) # 'user_name'とすべきところが'uer_name'になっている

上記のコードを実行すると、NameError: name 'uer_name' is not definedというエラーが出ます。

2. 変数の未定義または定義前の使用

Pythonは、変数が使用される前に必ず値が代入されていなければならないというルールがあります。値が一度も代入されていない変数や、代入されるコードが実行される前にその変数を参照しようとすると、NameErrorが発生します。

Pythonはコードを上から下へ、そして左から右へ実行します。そのため、変数を定義する行が、その変数を参照する行よりも「後」にある場合、Pythonはその変数を知らない状態になるためエラーとなります。

# 悪い例: 変数を使う前に定義していない
print(city) # 'city'はまだ定義されていない
city = "Tokyo"

また、条件分岐(if文など)の中で変数を定義し、その条件が満たされない場合に変数が定義されないまま外部で参照される、といったケースも同様にNameErrorを引き起こします。

# 悪い例: 条件によって変数が定義されない可能性がある
is_admin = False
if is_admin:
admin_message = "Welcome, Admin!"
print(admin_message) # is_adminがFalseの場合、admin_messageは定義されない

3. スコープ(有効範囲)の問題

Pythonには「スコープ」という概念があり、変数や関数がどこからアクセスできるかが決まっています。大きく分けて「グローバルスコープ」と「ローカルスコープ」があります。関数内で定義された変数(ローカル変数)は、その関数内でしかアクセスできません。関数の外でローカル変数を参照しようとするとNameErrorが発生します。

# 悪い例: ローカル変数をグローバルスコープから参照
def greet():
message = "Hello!" # これはローカル変数
greet()
print(message) # 関数外から'message'にアクセスしようとしている

また、関数内でグローバル変数を変更したい場合は、globalキーワードを明示的に使用する必要があります。globalをつけずに同名のローカル変数を定義してしまうと、意図せず新しいローカル変数を作成してしまい、グローバル変数が変更されない、あるいはグローバル変数にアクセスできないといった誤解を招くことがあります。

4. モジュールやライブラリのインポート忘れ

Pythonの多くの便利な機能は、モジュールやライブラリとして提供されています。これらのモジュール内の関数やクラスを使用するには、コードの先頭でimport文を使って明示的にインポートする必要があります。インポートを忘れると、そのモジュール内の名前が未定義となり、NameErrorが発生します。

# 悪い例: 'math'モジュールをインポートせずに'sqrt'を使用
result = sqrt(16) # 'sqrt'関数は'math'モジュールに属する

import mathfrom math import sqrtといったインポート文がないと、Pythonはsqrtという名前を知らないため、NameErrorとなります。

5. 古いPythonバージョンとの非互換性

ごく稀にですが、Pythonのバージョンアップによって、特定の関数やモジュールの名前が変更されたり、削除されたりすることがあります。古いPython 2のコードをPython 3環境で実行しようとした際に、このようなNameErrorに遭遇することがあります。

例えば、Python 2では存在したがPython 3では削除された組み込み関数を使用しようとした場合などが該当します。

6. 意図せず変数を削除してしまった

delキーワードを使って変数を明示的に削除した後、その変数を参照しようとするとNameErrorが発生します。これは意図的な操作ですが、デバッグ中に誤って削除コマンドを実行してしまい、その後エラーに気づくというケースも考えられます。

data = [1, 2, 3]
del data # 変数'data'を削除
print(data) # 削除後に参照しようとしている

これらの原因は、単独で発生することもあれば、複合的に絡み合ってより特定しにくいエラーを引き起こすこともあります。iPhoneの小さな画面でこれらを見つけるのは根気がいる作業ですが、エラーメッセージのヒントと上記のチェックリストを照らし合わせることで、必ず解決の糸口が見つかるはずです。

対処法

NameError: name '〇〇' is not definedに遭遇した際の対処法は、エラーメッセージが提供する手がかりを最大限に活用し、系統的にコードを検証することです。iPhoneでコードを修正する際には、拡大機能や、エディタアプリの構文ハイライト機能を積極的に利用し、細部にわたるまで見落としがないようにしましょう。焦りは禁物です。落ち着いて一つずつ確認していくことが、問題解決への最短ルートです。

1. 名前のスペルと大文字小文字を徹底確認する

NameErrorの原因として最も多いのが、このスペルミスや大文字小文字の違いです。エラーメッセージに表示された名前(例: 'my_variable')と、コード中で実際に使用している名前を、一文字ずつ丁寧に比較してください。

  • iPhoneでの確認ポイント:
    • ソフトウェアキーボードの自動修正によって意図しない文字に変換されていないか。
    • 半角・全角の区別。Pythonは半角英数字のみを識別します。見た目は同じでも全角のスペースや記号が混入していないか注意しましょう。
    • 大文字と小文字が正確に一致しているか。例えば、userNameと定義した変数をusernameと参照していないか。

# 例: スペルミスの場合
customer_name = "Taro"
print(customername) # -> 'customer_name' が正しい

# 例: 大文字小文字の違いの場合
TotalAmount = 100
print(totalAmount) # -> 'TotalAmount' が正しい

エディタの検索機能を使って、定義されている場所と参照している場所の名前を両方検索し、一致しているかを確認することも非常に有効です。

2. 変数を参照する前に必ず定義する

Pythonはコードを上から順に実行します。変数を参照する行が、その変数に値が代入される行よりも前にある場合、NameErrorとなります。エラーメッセージが指し示す行よりも前のコードブロックを遡り、該当する変数が確実に定義されているかを確認してください。

  • 初期化の確認: 変数を使う前に、必ず何らかの値を代入して初期化しているかを確認します。
  • 条件分岐での定義: if文などの条件分岐の中で変数を定義する場合、その条件が満たされないと変数が定義されないままプログラムが先に進んでしまうことがあります。このような場合、elseブロックで初期値を設定するなど、どのような場合でも変数が定義されるようにコードを修正する必要があります。

# 悪い例: 定義前の参照
print(greeting)
greeting = "Hello, Python!"

# 良い例: 定義後の参照
greeting = "Hello, Python!"
print(greeting)

# 悪い例: 条件分岐によって定義されない可能性がある変数
score = 85
if score > 90:
grade = "A"
print(grade) # scoreが90以下の場合、gradeは定義されない

# 良い例: 必ず定義されるようにする
score = 85
grade = "Undefined" # 初期値を設定
if score > 90:
grade = "A"
elif score > 80:
grade = "B"
print(grade)

3. スコープのルールを理解し、適切に変数を扱う

Pythonのスコープルール(LEGBルール: Local > Enclosing function locals > Global > Built-in)を理解することは、NameErrorの解決に不可欠です。特に、関数内で定義されたローカル変数は、その関数内でのみ有効であり、関数の外からは直接アクセスできません。

  • ローカル変数とグローバル変数の区別:
    • 関数内で新しい変数に値を代入すると、デフォルトでその関数だけのローカル変数となります。
    • 関数内でグローバル変数を参照することはできますが、変更したい場合はglobalキーワードを明示的に宣言する必要があります。さもなければ、同名のローカル変数が新しく作成されてしまい、NameErrorではないものの、意図しない挙動につながることがあります。

# 悪い例: ローカル変数をグローバルスコープから参照
def calculate_sum(a, b):
total = a + b # これはローカル変数
calculate_sum(5, 3)
print(total) # 関数外から'total'にアクセスしようとしている

# 良い例: 関数の戻り値を使用する
def calculate_sum_correct(a, b):
total = a + b
return total
result_sum = calculate_sum_correct(5, 3)
print(result_sum)

ネストされた関数(関数の中に定義された関数)の場合、外側の関数のローカル変数にはアクセスできますが(Enclosing scope)、その逆はできません。このスコープの概念をしっかり理解することが、複雑なプログラムでのNameError回避に繋がります。

4. 必要なモジュールやライブラリを正しくインポートする

Pythonの組み込み関数や、自分で作成した関数、あるいは外部のライブラリ(NumPy, Pandasなど)の機能を使用する場合、それらが適切なスコープで利用できるようにインポートされているかを確認します。

  • import module_name: モジュール全体をインポートし、その中の機能はmodule_name.function_name()のようにアクセスします。
  • from module_name import function_name: モジュールから特定の機能だけを直接インポートし、function_name()のようにモジュール名を付けずにアクセスできます。
  • import module_name as alias: モジュールに別名(エイリアス)を付けてインポートします。alias.function_name()のようにアクセスします。

# 悪い例: モジュールをインポートせずに機能を使用
pi_value = math.pi # 'math'モジュールがインポートされていない

# 良い例: 'math'モジュールをインポートしてから使用
import math
pi_value = math.pi
print(pi_value)

# 良い例: 特定の関数を直接インポート
from math import sqrt
result = sqrt(25)
print(result)

特にiPhoneでPythonコードを学習している場合、使いたい機能がどのモジュールに属しているのか、そしてどのようにインポートすれば良いのかを把握することが重要です。公式ドキュメントや信頼できるチュートリアルで、使用したい機能のインポート方法を確認しましょう。

5. Pythonのバージョン互換性を確認する

これは稀なケースですが、特に古いPython 2のコードをPython 3環境で実行している場合、バージョン間の非互換性によりNameErrorが発生することがあります。

  • raw_input vs input: Python 2のraw_input()はPython 3ではinput()に名称変更されました。
  • 一部の組み込み関数やモジュールの削除・名称変更: Pythonのバージョンアップに伴い、一部の機能が変更されることがあります。

使用しているPythonのバージョンを確認し(iPhone上でPythonを実行している場合はアプリの設定やヘルプを参照)、もし古いバージョンのコードを参照している場合は、現在のバージョンに合わせた構文に修正する必要があります。

6. デバッグツールやIDEの活用

複雑なプログラムや、原因特定が困難なNameErrorに直面した場合は、デバッグツールや高機能なIDE(統合開発環境)の利用を検討しましょう。iPhoneのPython実行環境には限りがあるかもしれませんが、PCで開発している場合は非常に有効です。

  • シンタックスハイライト: 多くのエディタは、定義済みの変数や関数、予約語などを異なる色で表示してくれます。これにより、スペルミスや未定義の名前を視覚的に見つけやすくなります。
  • コード補完(IntelliSense): 入力中に可能な変数名や関数名を提示してくれる機能です。これにより、スペルミスを防ぎ、正しい名前を素早く入力できます。
  • デバッガ: プログラムの実行を一時停止し、その時点での変数の値やプログラムの流れをステップバイステップで確認できるツールです。どの時点で変数が定義され、どの時点で未定義になるのかを正確に追跡できます。
  • Linter: コードの文法やスタイルを静的に解析し、潜在的なエラーや問題点を事前に警告してくれるツールです。未定義の変数などについても警告してくれることがあります。

これらのツールは、NameErrorだけでなく、他の多くのエラーのデバッグにも役立ちます。iPhone環境では利用できるツールに制限があるかもしれませんが、もしPCでの作業が可能であれば積極的に活用することをお勧めします。

これらの対処法を一つずつ、焦らず、そして注意深く確認していくことで、NameError: name '〇〇' is not definedはほぼ確実に解決できます。エラーメッセージは決してあなたを困らせるためにあるのではなく、問題解決のための明確なヒントを与えてくれているのだというポジティブな気持ちで臨みましょう。

補足:似たエラーとの違い

Pythonで遭遇するエラーは多種多様であり、それぞれが異なる原因と対処法を持っています。NameErrorは名前の未定義に関する問題ですが、見た目が似ていたり、混同されやすかったりする他の一般的なエラーもあります。これらの違いを明確に理解することは、エラーメッセージを正確に解釈し、効率的にデバッグを進めるために非常に重要です。iPhoneの画面にこれらのエラーが表示されたときに、冷静にその違いを見分けられるようになりましょう。

1. AttributeError: '...' object has no attribute '...'

このエラーは、「あるオブジェクト(データ)が持っていない属性(メソッドやプロパティ)にアクセスしようとした」場合に発生します。NameErrorが「その名前が存在しない」という問題であるのに対し、AttributeErrorは「その名前は存在するが、そのオブジェクトはその機能(属性)を持っていない」という問題です。

AttributeErrorの例 (iPhoneの画面を想定):

# 悪い例: 文字列オブジェクトに存在しないメソッドを呼び出す
my_string = "hello"
my_string.append(" world") # 文字列には'append'メソッドがない(リストのメソッド)
AttributeError: 'str' object has no attribute 'append'

# 良い例: 文字列の結合
my_string = "hello"
my_string += " world"
print(my_string) # hello world

NameErrorとの違い:

  • NameError: 「〇〇」という名前自体が、Pythonインタプリタによって認識されていない。
  • AttributeError: 「〇〇」という名前は認識されているオブジェクトだが、そのオブジェクトが「△△」という特定の機能(属性)を持っていない。

AttributeErrorが発生した場合は、対象のオブジェクトの型(例えば、str型やlist型など)を確認し、その型が持つメソッドや属性のリストを調べることが解決策になります(例: dir(my_object)をインタラクティブシェルで試す)。

2. TypeError: '...' object is not callable など

このエラーは、不適切な型の値に対して操作を行おうとした場合に発生します。例えば、関数ではないオブジェクトを関数として呼び出そうとしたり、数値演算ができないオブジェクトに対して数値演算を試みたりする場合などです。

TypeErrorの例 (iPhoneの画面を想定):

# 悪い例: 文字列を変数名と同じ名前の関数として呼び出す
message = "Hello"
message() # 'message'は文字列であり、関数ではないため呼び出せない
TypeError: 'str' object is not callable

# 良い例
def greet():
print("Hello")
greet() # 'greet'は関数なので呼び出せる

# 悪い例: 数値と文字列を直接加算
result = 10 + "5" # 数値と文字列は直接加算できない
TypeError: unsupported operand type(s) for +: 'int' and 'str'

NameErrorとの違い:

  • NameError: 「〇〇」という名前自体が未定義。
  • TypeError: 「〇〇」という名前は定義されているが、そのデータ型が、行おうとしている操作に対して不適切。

TypeErrorが発生した場合は、対象の変数の型が期待通りか(type()関数で確認)、その型に対して正しい操作を行っているか、関数の引数の数が合っているかなどを確認します。

3. SyntaxError: invalid syntax

このエラーは、Pythonの文法規則に違反している場合に発生します。コードの「書き方」がPythonの言語仕様に則っていないという問題です。これはNameErrorとは異なり、Pythonインタプリタがコードを実行する前の「解析」段階で検出されることが多いです。

SyntaxErrorの例 (iPhoneの画面を想定):

# 悪い例: 閉じ括弧が足りない
print("Hello world"
^
SyntaxError: invalid syntax

NameErrorとの違い:

  • NameError: 名前が定義されていないため、実行時に発生する。文法は正しいが、参照する名前が存在しない。
  • SyntaxError: コードの書き方そのものが文法的に誤っているため、実行以前に(多くの場合)検出される。

SyntaxErrorが出た場合は、エラーメッセージが指し示す行の括弧、引用符、コロン、演算子などを確認し、文法的に正しい形に修正します。

4. IndentationError

このエラーは、Pythonのインデント(字下げ)ルールに違反している場合に発生します。Pythonはインデントを使ってコードブロックを識別するため、スペースとタブの混在や、不適切なインデントレベルがあるとこのエラーが出ます。

IndentationErrorの例 (iPhoneの画面を想定):

# 悪い例: 予期しないインデント
print("Hello") # ファイルの先頭に不要なインデント
IndentationError: unexpected indent

NameErrorとの違い:

  • NameError: 名前が未定義であることに起因する。
  • IndentationError: コードの字下げに問題がある。

IndentationErrorSyntaxErrorの一種とみなされることもありますが、Pythonが特にインデントを重視するため、独立したエラーとして扱われます。

エラーの種類と問題の核心まとめ:

  • NameError: その「名前」(変数、関数、クラス、モジュール)がどこにも定義されていない。
  • AttributeError: その「オブジェクト」は存在するが、そのオブジェクトが特定の「属性(メソッド/プロパティ)」を持っていない。
  • TypeError: ある「データ型」に対して、その型では許可されていない操作を行おうとしている。
  • SyntaxError: コードの「書き方」がPythonの文法ルールに違反している。
  • IndentationError: コードの「字下げ」がPythonのインデントルールに違反している。

これらのエラーはそれぞれ異なる原因と対処法を持っていますが、すべてはエラーメッセージを正しく理解することから始まります。iPhoneの画面に表示されたエラーメッセージを冷静に読み解き、この記事で紹介した内容と照らし合わせることで、効率的に問題を解決し、より堅牢なPythonコードを書くことができるようになるでしょう。

まとめと次のステップ

NameError: name '〇〇' is not definedは、Pythonプログラミングにおいて遭遇する可能性が非常に高いエラーの一つですが、その原因のほとんどは、スペルミス、定義漏れ、スコープの誤解、インポート忘れなど、比較的小さなミスに集約されます。iPhoneなどのモバイル環境でコードを書く場合、これらの見落としが起きやすいかもしれませんが、エラーメッセージが明確なヒントを与えてくれるため、適切に対処すれば必ず解決できます。

このエラーは、Pythonがコードをどのように「読む」のか、そして変数や関数がどのように「存在する」のかという、Pythonの基本的な実行モデルを理解するための良い機会でもあります。エラーと向き合い、その意味を解読し、解決策を適用するプロセスを通じて、あなたのプログラミングスキルは着実に向上していきます。

Python学習の道のりでは、NameErrorに限らず、SyntaxErrorIndentationErrorAttributeErrorTypeErrorなど、さまざまな種類のエラーに遭遇することでしょう。しかし、これらのエラーメッセージは決してあなたを困らせるためにあるのではありません。むしろ、Pythonインタプリタがあなたに「ここが違うよ!こう直せばもっと良くなるよ!」と教えてくれている貴重な「教師」なのです。

もし、この記事の内容を試しても解決しないNameErrorに直面した場合は、以下のステップを検討してください。

  • オンラインフォーラムやコミュニティに質問する: エラーメッセージ全体と、エラーが出ている部分のコードを正確にコピーして、Stack Overflowやteratailなどのプログラミングコミュニティに投稿してみましょう。その際、使用しているPythonのバージョンや、iPhone上で利用しているエディタ(アプリ名)などの環境情報も添えると、より的確なアドバイスが得られやすくなります。
  • コードを最小限に絞る: エラーが発生している大きなコードの中から、問題の原因となっている可能性のある部分だけを抜き出し、最小限のシンプルなコードで同じエラーが再現できるか試してみましょう。これにより、問題の範囲が明確になり、原因特定が容易になります。
  • Python公式ドキュメントを参照する: 使用している関数やモジュールについて、Pythonの公式ドキュメントで定義や使用例を確認しましょう。思わぬ仕様の違いが原因であることもあります。

デバッグは、プログラミングスキルの中でも特に重要な要素の一つです。エラーを恐れず、積極的にその原因を解明しようとする姿勢が、あなたをより優れたPythonプログラマーへと導くでしょう。この記事が、あなたのPython学習におけるNameErrorの壁を乗り越える一助となれば幸いです。頑張ってください!