インデントの重要性とエラーの仕組み
Pythonにおいて、コードの行頭の空白(インデント)は単なる見栄えの調整ではなく、プログラムの構文解析の核心部分です。他の多くのプログラミング言語が中括弧{}やendキーワードでブロックを囲むのに対し、Pythonはインデントレベルによってコードの塊(スコープ)を定義します。
そのため、インデントが期待される位置と異なる場所にある場合、インタプリタは「どのブロックに属する文なのか」を判断できず、処理を停止します。これがIndentationError(インデントエラー)です。
このエラーが頻発する理由は、人間が見た目上は「整っている」と感じても、コンピュータが判定する論理的なインデントレベルが崩れているケースが多いからです。

インデントの重要性とエラーの仕組みで迷っていませんか?
実例コードも交えながら、つまずきやすいポイントを順番に整理します。
順番に確認できる形でまとめているので、必要なところからすぐ試せます。
なぜインデントが厳しいのか
Pythonの設計思想には「読みにくいコードは存在しない」という哲学があります。インデントを強制することで、コードのネスト構造を視覚的に明確にし、チーム開発や保守性を高める役割を果たしています。しかし、初学者にとっては、「見えていない文字」の問題であるため、修正に時間がかかる障害になり得ます。
ポイント:
インデントエラーは「書式違反」ではなく「構文エラー」です。コードの論理的な繋がりが切れている状態と理解しましょう。
原因1 インデントの深さがブロック外にある
最も一般的なパターンが、インデントを深くしすぎている、または浅くしすぎているケースです。これは、ブロックの開始を示すコロン(:)の直後や、ブロックの終了位置でよく発生します。
具体的な確認方法
例えば、for文やif文、関数定義の直後に記述する処理は、そのブロックの中に含まれる必要があります。以下に失敗例と成功例を示します。
失敗例: インデントが浅すぎる(IndentationError: expected an indented block)
この場合、処理ブロック内でインデント(空白)が入っていないため、Pythonは次の行がブロック外であると解釈します。
for i in range(5):
print(i) # ここでエラー:行頭に空白がない上記の例では、print(i)の行頭に空白がありません。if文やループ処理の次の行は、インデントでネストを表現する必要があるため、少なくとも半角スペース1つ以上が必要です。
成功例: インデントを追加する
for i in range(5):
print(i) # 前方に半角スペース4つ分(推奨)を入れる失敗例: インデントが深すぎる(IndentationError: unexpected indent)
逆に、ブロックの範囲を超えてインデントを深くしすぎた場合にもエラーになります。トップレベルの文の後に、いきなりインデントされた文が来ることは論理的に矛盾しています。
x = 10
y = 20 # ここでエラー:直前の文がブロックを開始していない解決手順
- エラーメッセージに表示される行数と文を確認する。
- その行の直前の行が、ブロックの開始(コロンで終わる文)かどうかを確認する。
- その行のインデント深度(空白の数)を、直前のブロックに合わせる。
注意:
一見インデントされているように見えても、空行が挟まれている場合、Pythonはブロックの継続とはみなさないことがあります。論理的な流れに沿って空白を追加してください。
解決策2 スペースとタブの混同を解消する
現代のエディタやIDEはデフォルトで「タブ挿入」を「スペースへの変換」にするものが多いですが、設定が異なるファイル同士をコピー&ペーストしたり、古いコードを編集したりすると混在しがちです。
Python 3以降では、同じインデントブロック内でスペースとタブを混在させることは許可されていません。これが混在すると、視覚的には揃っていても論理的なエラーとして検知されます。
環境ごとの設定確認と修正手順
このエラーが発生した際は、以下の3つのステップで対策を講じてください。
現在のインデント単位の確認
まず、エディタの設定で、インデントに「タブ」が使用されていないか確認します。Pythonコミュニティでは半角スペース4つが標準的な推奨事項です。タブを使用している場合は、スペース4つに変更することを強く推奨します。
視覚化の設定
エディタの設定で「空白の表示」や「タブの表示」を有効にしてください。多くのエディタでは、スペースは「・」や「␣」のような記号で、タブは「→」のような記号で表示されます。これらを視認することで、混在を即座に発見できます。
一括変換の実行
コード全体を選択し、エディタの機能を使って「タブをスペースに変換」またはその逆を実行します。PyCharmであれば「Convert Indents to Spaces」などが該当します。VS Codeであれば、右下のステータスバーから「Indent Using Spaces」を選択・変更できます。
手動での修正方法(注意点)
もし手動で修正する場合は、エラーが出ている行の先頭にある空白をすべて削除し、再度スペースキーで打ち直すのが確実です。バックスペースキーで削除する場合、目に見えないタブ文字が残ってしまうリスクがあるため、一度行頭の空白を完全に削除してから、スペースを打ち直すのが最も安全です。
注意:
コピーしたコードにエラーが含まれている場合、元のファイルのフォーマット設定を優先して貼り付けましょう。
解決策3 直前の文の終了有無とブロック構造を確認する
インデントの問題として、よく見逃されるのが「直前の行がまだ処理中である」というケースです。ブロックの開始と終了、およびネストの深さを正しく把握することで、誤解を防げます。
コロン位置と複数行の結合忘れへの対応
if文、for文、while文、def文、class文などは、行の末尾にコロン(:)を置く必要があります。これを忘れると、Pythonは「次の行もこの文の続きである」と解釈し、次の行のインデントを確認します。しかし、次の行が新しいブロックの開始(インデントがある)であると解釈されず、構文解析に失敗したり、意図しない動作をしたりします。
失敗例: コロンを忘れている
# コロンがないため、次のprint文もifの条件付きとして解釈されようとするが
# コロンの欠如によりSyntaxErrorまたはIndentationErrorの原因になる
x = 10
if x > 5
print("5より大きい") # ここでエラー、または直前でSyntaxErrorこの場合、if x > 5の後にコロンがないため、文の終わりを検知できません。一般的にはSyntaxErrorとして報告されますが、その後のインデントの不整合によってIndentationErrorとして検知されることもあります。エラーメッセージがSyntaxErrorであっても、直後の行のインデント設定を見直す必要があります。
失敗例: 複数行の結合忘れ
また、長い行を折り返す際に、括弧内であるためインデント不要と勘違いして、インデントを戻しすぎることがあります。括弧内で改行する場合、続けて書かれているため、適切なインデント深度を維持する必要があります。
result = long_function_name(
var_one, var_two,
var_three, var_four # ここでインデントを戻すとエラー
)解決のためのチェックリスト
インデントエラーを解決する際は、以下の項目をチェックしましょう。
- コロンの有無: if, for, def, classなどの定義文の末尾にコロンがあるか確認しましょう。
- 文の区切りの確認: エラーが出ている行が、新しいブロックの開始なのか、同じブロック内の処理なのかを判断します。
- ブロックの開始:直前にコロンがある文、またはブロックの先頭
- 同じブロック内:直前の処理と同じインデント深度にする
例えば、for文のループ内での変数計算とループ後の処理は、インデント深度が異なります。
for i in range(3):
print(i) # 1. ループ内の処理(インデントあり)
print("終了") # 2. ループ外(インデントなし)このように、「いつブロックを抜けるのか」を意識してインデントの深さを変える必要があります。
注意:
ドックストリングやコメント行でインデントに違和感を感じた場合、それが論理的なブロックの一部として扱われない場合があるため、インデントの深さを調整しましょう。
上級者向けヒント: リーダブルなコードのためのインデント基準
初学者向けの解決策だけでなく、開発現場で求められる基準も押さえておくと、将来的なエラーを減らすことができます。
PEP 8(Pythonの公式コーディング規約)では、1インデントあたり4つの半角スペースを使用することが推奨されています。
- 2スペースや8スペースは避ける: 可読性と括弧のネスト深度のバランスが悪くなります。
- タブを使用しない: 前述の通り、エディタの表示幅の設定によってインデントがずれて見えたり、環境によって混在したりするリスクがあります。
- 括弧内のインデント: 括弧で囲まれた内容の場合は、括弧の直後にスペースを空けるか、行を丸ごとインデントするかの統一が重要です。一般的には行ごとインデントするのがPython的です。
# PEP 8準拠の良い例
foo_bar_func(
arg_one,
arg_two,
arg_three,
)
# ネストが深くなる場合
if x:
if y:
print("deep")また、コードフォーマッター(Black, autopep8など)を導入することで、手動でインデントを揃えるミスを自動化できます。チーム開発や公開用のコードを書く場合は、フォーマッターの適用を習慣づけましょう。
まとめ
PythonのIndentationErrorは、以下の3つのチェックリストでほぼ解決します。
- ブロックの開始位置: if, for, defなどの直後の処理はインデントされているか?
- 空白の一貫性: スペースとタブが混在していないか?(エディタの設定を確認)
- 文の完了: 定義文の末尾にコロンがあるか?
初心者の方ほど、エラーメッセージの行番号だけでなく、その前に行の論理的なつながりを見直すことで、原因を特定しやすくなります。また、エディタの表示設定を工夫し、「見えていない空白」を可視化することは、長期的にプログラミングの生産性を上げることにつながります。慣れないうちは、4つの半角スペースを単位として使用し、ペーストするコードは常にフォーマットし直す癖をつけましょう。
FAQ
Q: エラーメッセージに’expected an indented block’と出ますが、空白を入力しても直りません。
A: 既に空白が入っている場合、その空白が「半角スペース」ではなく「タブ文字」である可能性が高いです。また、エディタの設定でインデント幅がずれている場合も、論理的な深さが合っていないことがあります。行の先頭にある空白をすべて削除し、半角スペースキーで4つ入力し直してみてください。
Q: コピペしたコードでインデントエラーがたくさん出ます。
A: 元のコードとあなたのエディタの設定(タブ幅、スペース/タブの混在設定)が異なるためです。コードを選択した状態で、エディタの「インデント形式を変換」機能(例:VS Codeの「Convert Indentation to Spaces」)を実行すると、全体が現在の設定に合わせて修正されます。
Q: インデントの深さは4スペースが必須ですか?
A: Pythonとしては2スペースや8スペースでも構文エラーにはなりません。ただし、業界標準であるPEP 8では4スペースが推奨されています。チーム開発や他者とコードを共有する場合は、4スペースまたはあなたのエディタで設定している単位に合わせて統一してください。

ここまで読んでいただきありがとうございます!
UdemyのPythonコースにはオンラインで学習ができる動画コンテンツがたくさんあります。
当ブログのような文章メインの説明では足りない箇所を補えると思うので、もっと詳しく勉強したいという方はぜひチェックしてみてください!


コメント