IndentationError が出た時の原因と解決方法【スペースとタブに注意】

Last Updated on 2025年7月28日

IndentationError が出た時の原因と解決方法【スペースとタブに注意】

IndentationError が出た時の原因と解決方法【スペースとタブに注意】

Pythonを学んでいると、多くの開発者が一度は遭遇するであろう厄介なエラーの一つがIndentationErrorです。このエラーは、コードの「見た目」とPythonの「文法」が密接に関わっているPythonならではの特性によって引き起こされます。特に、別のプログラミング言語からPythonに移行してきた方や、iPhoneなどのモバイルデバイスで手軽にコーディングをしている方にとっては、このインデントのルールが思わぬ落とし穴となることがあります。

IndentationErrorは、コードの字下げ(インデント)がPythonの期待する形式と異なる場合に発生します。多くの場合、原因はスペースとタブの混在、あるいは不適切なインデントレベルです。このエラーに直面すると、「どこが間違っているのか分からない!」と頭を抱えてしまいがちですが、ご安心ください。このガイドでは、IndentationErrorの具体的な内容から、その発生原因、そしてiPhoneの画面で確認しながらできる効果的な解決方法までを、豊富なコード例を交えて詳しく解説します。

さらに、IndentationErrorと混同されやすい他の一般的なエラーとの違いについても触れることで、エラーメッセージの正確な読み解き方を身につけ、より迅速なデバッグ能力を養う手助けをします。この記事を読み終える頃には、あなたはIndentationErrorの専門家となり、スムーズなPython開発へと一歩踏み出せることでしょう。

目次

エラー内容

Pythonでコードを実行していると、突然以下のようなエラーメッセージが表示されることがあります。これがIndentationErrorです。

File "your_script.py", line 5
print("Hello")
^
IndentationError: unexpected indent

または

File "your_script.py", line 8
another_variable = 20
^
IndentationError: expected an indented block

これらのメッセージは、Pythonインタプリタがコードの字下げ(インデント)を解析する際に、予期しない、あるいは期待されるインデントが見つからなかった場合に発生します。エラーメッセージが示す情報は以下の通りです。

  • File "your_script.py": エラーが発生したファイル名です。
  • line 5 (または line 8): エラーが検出された具体的な行番号です。ほとんどの場合、この行、またはこの行の直前の行に問題があります。
  • print("Hello") (または another_variable = 20): エラーが発生した行のコードが表示されます。
  • ^(キャレット): これはエラーの原因となっているインデントの位置を指し示しています。このキャレットが指す部分をiPhoneの画面で確認し、その行の先頭の空白文字に注目してください。
  • IndentationError: unexpected indent: 「予期しないインデント」という意味です。これは、Pythonがその場所でインデントを予期していなかったにもかかわらず、インデントが見つかった場合に発生します。例えば、コードブロックの外部で不必要に字下げがされている場合などです。
  • IndentationError: expected an indented block: 「期待されるインデントブロックがない」という意味です。これは、Pythonがインデントされたコードブロック(例えば、if文やforループの本体、関数やクラスの定義の内部など)を期待しているにもかかわらず、それが見つからなかった場合に発生します。通常、コロン(:)で終わる行の次の行でインデントがされていない場合に起こります。

Pythonでは、他の多くのプログラミング言語のように波括弧({})などを使ってコードブロックを区別する代わりに、インデントを使ってコードの構造を示します。例えば、if文の条件が真であった場合に実行されるコード、forループで繰り返されるコード、関数内で実行されるコードなどは、必ず適切なインデントを付けて記述する必要があります。このルールに違反すると、IndentationErrorが発生するのです。

iPhoneのテキストエディタでコーディングしていると、インデントのズレは非常に見落としやすい問題です。特に、自動補完や自動インデント機能が不十分なエディタを使用している場合や、異なる環境からコードをコピー&ペーストした場合に発生しやすいため、エラーメッセージの示す行番号とキャレットの位置を頼りに、その行の先頭の空白文字を注意深く確認することが解決の鍵となります。

原因

IndentationErrorは、Pythonのコードが「字下げ」という文法ルールに従っていないことを示します。このエラーの根本的な原因は、Pythonのインタプリタがコードの構造を解析する際に、期待するインデントと実際のインデントが食い違っていると判断することにあります。iPhoneの小さな画面でコードを見ていると、特に視覚的に見分けにくい「空白文字」が原因となることが多いため、注意が必要です。

1. スペースとタブの混在

これがIndentationError最も一般的な原因です。Pythonでは、インデントにスペースを使うか、タブを使うかのどちらかに統一する必要があります。両方を同じファイル内で混在させると、Pythonインタプリタは異なるインデントレベルと解釈し、IndentationErrorを発生させます。

例えば、ある行はスペース4つでインデントし、別の行はタブ1つでインデントしている場合、見た目では同じように字下げされていても、Pythonはこれを別々のインデントレベルと見なします。iPhoneのキーボードで手入力している場合や、異なるエディタや環境からコードをコピー&ペーストしてきた場合に、この問題が頻繁に発生します。

悪い例: スペースとタブの混在(見た目では同じインデントに見えるが、実際は異なる)

def my_function():
print("Hello from function") # ここはスペース4つ
→ if True: # ここはタブ1つ(iPhoneの画面上ではスペース4つに見えるかも)
print("Inside if")

このような状況では、Pythonはif True:の行がmy_functionの内部のインデントレベルからずれていると判断し、IndentationErrorを引き起こします。

2. 不適切なインデントレベル

Pythonのインデントルールでは、コードブロックの始まりでインデントを増やし、コードブロックの終わりでインデントを元に戻す必要があります。このインデントの増減が正しくない場合もエラーになります。

  • 予期しないインデント (unexpected indent):

    これは、Pythonがその場所でインデントを全く予期していないにもかかわらず、インデントが見つかった場合に発生します。例えば、ファイルの先頭や、関数やループの外部で不要な字下げがある場合などです。

    悪い例: 不要なインデント

    print("Hello world") # ファイルの先頭に不要なインデント

    この場合、Pythonはコードの開始地点でインデントを予期しないため、エラーとなります。

  • インデントが足りない(期待されるインデントがない) (expected an indented block):

    これは、Pythonがインデントされたコードブロックを期待しているにもかかわらず、それが見つからなかった場合に発生します。通常、if文、forループ、whileループ、関数定義(def)、クラス定義(class)など、コロン(:)で終わる行の次の行でインデントがされていない場合に起こります。

    悪い例: 期待されるインデントがない

    if some_condition:
    print("Condition is true") # この行にインデントがない

    この場合、if文のコロンの後に続くコードが適切にインデントされていないため、Pythonはコードブロックの始まりを見つけられず、エラーとなります。

3. 予期しないインデント (unexpected indent) の詳細

この特定のエラーは、特に以下のような状況でよく見られます。

  • 最上位レベルでのインデント: ファイルの一番最初の行や、他のどのコードブロックにも属さないはずのコードがインデントされている場合。Pythonのコードは通常、一番左端(インデントなし)から始まります。
  • 不要な空行やコメント行のインデント: 空行やコメント行は通常インデントの影響を受けませんが、その直前の行のインデントが正しくない場合、Pythonがその後の行を誤って解析し、unexpected indentを報告することがあります。
  • 連続するコードブロック内のインデントの不整合: 例えば、ネストされたif-elseブロックなどで、elseelifの位置が、対応するif文のインデントレベルと合っていない場合などです。

4. インデントが足りない(期待されるインデントがない) (expected an indented block) の詳細

この特定のエラーは、特に以下のような状況でよく見られます。

  • コロン(:)の忘れ: if, for, defなどの後にコロンを忘れると、Pythonはその行がブロックの開始を示すと判断せず、次の行のインデントされたコードが予期せぬものとなり、SyntaxErrorとなるか、あるいはコロンを忘れたことでexpected an indented blockが報告されることもあります。
  • 空のブロック: コードブロックが空の場合、Pythonはインデントされたブロックを期待しますが、何も見つからないためエラーとなります。このような場合は、passキーワードを使用して、明示的に空のブロックを示す必要があります。

    悪い例: 空の関数定義

    def empty_function():
    # 何も書かない

    良い例: 空のブロックをpassで表現

    def empty_function():
    pass

これらの原因は、iPhoneの小さい画面でコードを視認しづらいという特性も相まって、発見が難しくなることがあります。しかし、IndentationErrorが発生した場合は、まずはスペースとタブの混在を疑い、次にエラーメッセージが指し示す行とその周辺のインデントレベルを注意深く確認することが重要です。

対処法

IndentationErrorは、Pythonのインデントルールを理解し、適切なツールと方法を用いることで、ほとんどの場合簡単に解決できます。iPhoneでコーディングしている場合でも、以下の対処法を試すことで、効率的に問題を特定し、修正することが可能です。

1. コードエディタの設定を確認する

最も効果的で根本的な解決策は、使用しているコードエディタ(iPhoneのアプリを含む)の設定を見直し、インデントの統一性を確保することです。

  • タブをスペースに変換する設定: 多くのプログラマーは、Pythonのインデントにスペース4つを使用することを推奨しています(PEP 8の推奨)。お使いのエディタで、タブキーを押したときに自動的にスペース4つが挿入されるように設定しましょう。これは「タブをスペースに変換する」や「Convert tabs to spaces」といったオプションとして提供されていることが多いです。
  • スペースの可視化: エディタによっては、スペースやタブといった不可視文字を表示する機能があります。これを有効にすることで、スペースとタブが混在している箇所を目視で簡単に特定できるようになります。iPhoneのアプリでも、設定やメニュー内に「Show Whitespace」などのオプションがないか確認してみてください。

2. 目視での確認と修正

エラーメッセージが示す行と、その周辺の行のインデントをiPhoneの画面で拡大表示しながら、注意深く確認します。

  • 行頭の空白に注目: 各行の先頭にある空白文字が、他の行と同じパターン(全てスペースか、全てタブか)で揃っているかを確認します。
  • コロン(:)の次の行: if, for, while, def, classなど、コロンで終わる行の次の行が正しくインデントされているか、またインデントされすぎている箇所がないかを確認します。
  • ブロックの終わり: コードブロックが終わる部分(例えば、ifブロックの次のelseや、関数定義の後のコードなど)で、インデントが適切に戻されているかを確認します。

目視だけでは難しい場合でも、怪しいと思う行のインデントを一度すべて削除し、正しい数のスペース(通常4つ)で打ち直すことで解決することがよくあります。

3. テキストエディタの機能活用

多くの高機能なコードエディタやIDE(統合開発環境)には、インデントの問題を解決するための便利な機能が備わっています。iPhoneで利用できるPythonエディタアプリでも、同様の機能が提供されている場合があります。

  • 選択範囲のインデント/アンインデント: 複数の行を選択し、一括でインデントレベルを増減させる機能です。これにより、誤ったインデントが適用されたブロック全体を簡単に修正できます。
  • フォーマット機能/整形機能: コード全体や選択した部分を、設定したスタイルガイド(例: PEP 8)に基づいて自動的に整形してくれる機能です。この機能を使えば、インデントだけでなく、空白の入れ方なども統一され、IndentationErrorの原因を大幅に減らすことができます。これは非常に強力な機能なので、ぜひ活用してください。

4. インデントを統一するツールや機能の利用

もしエディタの機能で解決できない場合や、大規模なプロジェクトで手動修正が難しい場合は、外部ツールを利用することも有効です。

  • autopep8, Black, Flake8などのLinter/Formatter: これらのツールは、Pythonコードのスタイル(インデントを含む)を自動的に修正したり、スタイルガイドからの逸脱を報告したりしてくれます。開発環境にこれらを導入することで、IndentationErrorが発生しにくい状態を維持できます。iPhoneでこれらのツールを直接実行するのは難しいかもしれませんが、PCでこれらのツールを使ってコードを整形し、整形されたコードをiPhoneに転送するというワークフローも考えられます。
  • オンラインのコードフォーマッター: 一時的な解決策として、オンラインで利用できるPythonコードフォーマッターにエラーが出ているコードを貼り付け、整形されたコードをコピーして戻すという方法もあります。

5. 問題の行を打ち直す

最も原始的ですが、非常に効果的な方法です。エラーメッセージが示す行と、その周辺の数行を一度完全に削除し、半角入力モードであることを確認した上で、一から手動で打ち直します。これにより、目に見えない全角スペースや、誤って入力されたタブ文字などが排除され、クリーンなインデントでコードを記述できます。

特にiPhoneのフリック入力などで素早く入力していると、無意識のうちに全角スペースが入ってしまったり、インデントがずれてしまったりすることがあります。この方法は、そうしたヒューマンエラーを確実に排除するのに役立ちます。

6. 外部からのコピー&ペーストに注意する

ウェブサイトや他のソースからPythonコードをコピー&ペーストする際は、特にIndentationErrorが発生しやすいです。ウェブサイトのテキストは、タブとスペースが混在していたり、予期しない空白文字が含まれていたりすることがあります。

コピー&ペーストする際は、以下のいずれかの方法を試しましょう。

  • プレーンテキストとして貼り付ける: コードエディタの「Paste as Plain Text」や「書式なしで貼り付け」などの機能を利用します。
  • 一度メモ帳などで浄化する: コードを一度プレーンテキストエディタ(iPhoneのメモアプリなど)に貼り付け、そこから再度コピーして目的のコードエディタに貼り付けることで、余計なフォーマット情報や不可視文字が除去されることがあります。
  • 貼り付け後に整形する: 貼り付けた後、すぐにエディタの自動フォーマット機能(前述の「整形機能」)を実行して、インデントを統一します。

これらの対処法を一つずつ、冷静に、そして丁寧に試していくことで、ほとんどのIndentationErrorは解決できるはずです。Pythonのインデントルールは最初は戸惑うかもしれませんが、慣れてしまえばコードの可読性を高める強力な味方となるでしょう。

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

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

1. SyntaxError: invalid syntax

このエラーは、Pythonの文法規則に違反している場合に発生します。つまり、コードの「書き方」がPythonの言語仕様に則っていないという根本的な問題です。IndentationErrorがインデントという特定の文法ルールに関するものであるのに対し、SyntaxErrorはより広範な文法ミス(例:括弧の閉じ忘れ、コロンの忘れ、予約語の誤用など)を指します。

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

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

# 悪い例: コロンを忘れている
if True
print("This is true")
^
SyntaxError: invalid syntax

IndentationErrorとの違い:

  • IndentationErrorは、インデントの形式(スペースかタブか、レベルのずれなど)が問題。コードの「構造」に関するエラー。
  • SyntaxErrorは、インデント以外の文法的な間違い全般。例えば、キーワードの使い方、演算子の使い方、区切り文字の忘れなど、コードの「記述」そのものに関するエラー。

IndentationErrorSyntaxErrorの一種と考えることもできますが、Pythonが特別にインデントの重要性を強調するために分離されたエラータイプです。SyntaxErrorが発生した場合、まずはエラーメッセージが指し示す行の括弧、引用符、コロン、演算子などを確認しましょう。

2. NameError: name '...' is not defined

このエラーは、存在しない変数名、関数名、クラス名、またはモジュール名を参照しようとした場合に発生します。コードの文法自体は正しいのですが、Pythonがその「名前」を現在のスコープ(有効範囲)内で見つけることができない、という状況です。

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

# 悪い例: 未定義の変数を参照
message = "Python"
print(massage) # 'message'のスペルミス('massage'になっている)
^
NameError: name 'massage' is not defined

# 悪い例: 未定義の関数を呼び出す
calculate_sum(10, 20) # 'calculate_sum'が定義されていない
^
NameError: name 'calculate_sum' is not defined

IndentationErrorとの違い:

  • IndentationErrorは、コードの「字下げ」に問題がある。
  • NameErrorは、コード内で使われている「名前」が、どこにも定義されていない。

NameErrorが発生した場合は、スペルミスがないか、変数が定義される前に使われていないか、必要なモジュールがインポートされているかなどを確認します。

3. TypeError: '...' object is not callable

このエラーは、不適切なデータ型に対して操作を行おうとした場合に発生します。特に、「'...' object is not callable」というメッセージは、関数ではないオブジェクトを関数として呼び出そうとしたときに頻繁に見られます。

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

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

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

IndentationErrorとの違い:

  • IndentationErrorは、コードの「字下げ」に問題がある。
  • TypeErrorは、データの「型」に関する問題。例えば、ある型のデータに対して、その型では許可されていない操作を行おうとしている。
エラーの種類と問題の核心まとめ:

  • IndentationError: コードの「字下げ」(スペースとタブの混在、インデントレベルのずれ)がPythonのルールに違反している。
  • SyntaxError: IndentationError以外の、Pythonのより広範な「文法」ルールに違反している(例:括弧閉じ忘れ、コロン忘れ)。
  • NameError: 存在しない「名前」(変数、関数など)を参照しようとしている。
  • TypeError: 不適切な「データ型」に対して操作を行おうとしている。

これらの違いを理解することで、iPhoneの小さな画面に表示されたエラーメッセージを見たときに、より迅速に問題の根本原因にたどり着き、効率的なデバッグが可能になります。エラーメッセージは単なる警告ではなく、問題解決のための貴重な手がかりなのです。

まとめと今後の学習

IndentationErrorは、Pythonのユニークな文法ルールである「インデント」に起因するエラーであり、特に初心者や、他の言語からPythonに移行してきた開発者が戸惑いやすいポイントです。しかし、この記事で解説したように、その原因のほとんどはスペースとタブの混在不適切なインデントレベルに集約されます。

iPhoneなどのモバイル環境でコーディングしている場合、インデントの視認性が低く、手動での調整が難しいという課題があるかもしれません。しかし、エラーメッセージが示す行番号とキャレットの位置を注意深く確認し、そして何よりもコードエディタの設定を適切に行うことで、この問題を大幅に軽減できます。タブをスペースに変換する設定を有効にし、可能であれば不可視文字の表示機能を利用することで、目に見えないインデントの不整合を視覚的に捉えることができるようになります。

Pythonプログラミングの学習過程において、エラーは避けて通れない道です。IndentationErrorに限らず、SyntaxErrorNameErrorTypeErrorなど、さまざまなエラーに遭遇するでしょう。しかし、それぞれのエラーメッセージが何を意味しているのかを理解し、冷静にデバッグのプロセスを踏むことで、あなたのプログラミングスキルは着実に向上します。エラーは、あなたがコードをより深く理解し、より堅牢なプログラムを書くための「教師」なのです。

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

  • オンラインフォーラムやコミュニティに質問する: エラーメッセージ全体と、エラーが出ている部分のコードを正確にコピーして、Stack Overflowやteratailなどのプログラミングコミュニティに投稿してみましょう。その際、使用しているPythonのバージョンや、iPhone上で利用しているエディタ(アプリ名)などの環境情報も添えると、より的確なアドバイスが得られやすくなります。
  • コードを簡略化してみる: エラーが発生しているコードブロックだけを抜き出し、最小限のシンプルなコードで同じエラーが再現できるか試してみましょう。これにより、問題の原因がより明確になることがあります。
  • 公式ドキュメントを参照する: Pythonの公式ドキュメントには、文法ルールやエラーメッセージに関する詳細な情報が記載されています。

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