PythonのIndexError: list index out of rangeを直す|リスト範囲外の原因
Pythonのリストから値を取り出したとき、IndexError: list index out of range と表示されることがあります。これは、リストに存在しない番号を指定したことが原因です。この記事では、3要素のリストに番号3を指定する例と、空リストの末尾を取る例を実行し、安全な直し方を確認します。
結論
番号が変わる可能性がある場合は、取り出す前に 0 <= index < len(fruits) を確認します。条件を満たすときだけ fruits[index] を実行すれば、範囲外の番号で停止しません。
fruits = ["りんご", "バナナ", "みかん"]
index = 3
if 0 <= index < len(fruits):
print(f"選んだ果物: {fruits[index]}")
else:
print(f"番号{index}の要素はありません")
発生している問題
リストの要素は3個でも、利用できる番号は0、1、2です。次のコードでは4番目の要素を意味する番号3を指定しているため、処理が2行目で止まります。
修正前コード
fruits = ["りんご", "バナナ", "みかん"]
print(fruits[3])
ローカルのPython 3.14.2とAI Work StudioのPython実行画面で、どちらも最後に同じエラーが表示されました。
IndexError: list index out of range
原因
Pythonのリスト番号は0から始まります。fruits[0] は「りんご」、fruits[1] は「バナナ」、fruits[2] は「みかん」です。len(fruits) は3を返しますが、3は要素数であり、最後の番号ではありません。
Python公式ドキュメントでは、IndexError はシーケンスの添字が範囲外のときに発生すると説明されています。また、負の番号は末尾から数えるため、要素があるリストなら fruits[-1] で最後の値を取得できます。
ただし、負の番号なら必ず安全という意味ではありません。空リストには末尾の要素がないため、次のコードも同じIndexErrorになります。
fruits = []
print(fruits[-1])
修正後コード
len() で要素数を取得し、番号が0以上かつ要素数未満かを確認します。今回は番号3が範囲外なので、リストを参照せず案内を表示します。
fruits = ["りんご", "バナナ", "みかん"]
index = 3
if 0 <= index < len(fruits):
print(f"選んだ果物: {fruits[index]}")
else:
print(f"番号{index}の要素はありません")
実行結果
index = 3 の結果は次のとおりです。
番号3の要素はありません
index = 1 へ変更すると、範囲内なので次の結果になります。
選んだ果物: バナナ
ローカルとAI Work Studioで修正前、空リスト、修正後の2パターンを実行し、記事のエラー名と出力が一致することを確認しました。Pythonの結果はConsoleに表示され、Previewは表示内容なしでした。標準入力は使わない例なので空欄のままです。
よくある間違い
len(fruits)を最後の番号だと思う
要素数が3なら、最後の番号は2です。最後の番号は len(fruits) - 1 ですが、空リストでは値が-1になるため、実際に参照する前にリストが空でないことも確認します。
負の番号なら空リストでも使えると思う
-1 は「最後の要素」を表しますが、空リストには最後の要素がありません。空になる可能性があるデータでは、要素の有無を先に確認します。
すぐtry/exceptで隠す
IndexErrorを捕まえる方法もありますが、利用者が選んだ番号を扱う処理では、参照前の範囲チェックの方が「どの番号なら使えるか」を読み取りやすくなります。予想できる範囲外は条件分岐で防ぎ、予想外の問題までまとめて隠さないようにします。
AI Work Studioで試す手順
- AI Work Studioを開き、Pythonタブを選びます。
- 修正前コードを貼り、表示方法をConsoleへ切り替えます。
- 「Pythonを実行」を押し、Consoleの最後に
IndexError: list index out of rangeが出ることを確認します。 - 修正後コードへ置き換え、
index = 3で実行します。 番号3の要素はありませんを確認したら、index = 1へ変えて再実行します。選んだ果物: バナナになれば、範囲内と範囲外の両方を確認できています。
まとめ
IndexError: list index out of range は、リストに存在しない番号を参照したときに発生します。番号は0から始まり、利用できる範囲は 0 以上 len(リスト) 未満です。値を取り出す前に範囲を確認し、空リストでは -1 も使えないことを覚えておきましょう。