IndexError: list index out of range の原因と直し方
リストの範囲外の添字にアクセスしたときに出るエラーです。添字が0始まりであることの直接の帰結です。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
IndexError- 例外クラス — 何が起きたか。ここを検索するのが最短です
list index out of range- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 nums = [1, 2, 3] 2 print(nums[3 ]) ^
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(nums[3])
~~~~^^^
IndexError: list index out of range
リストの添字は0から始まり、最後の要素は「長さ-1」です。要素数と同じ値を指定すると1つ超えてしまいます。
直し方: 3 を 2 にします。
広告
広告スロット(未設定)
パターン2
1 names = ["a", "b"] 2 print(names[5 ]) ^
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(names[5])
~~~~~^^^
IndexError: list index out of range
存在する要素数を超えた添字を指定すると発生します。len()で長さを確認する習慣があると防げます。
直し方: 5 を 1 にします。
パターン3
1 fruits = ["apple", "banana", "cherry"] 2 for i in range(4 ): ^ 3 print(fruits[i])
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(fruits[i])
~~~~~~^^^
IndexError: list index out of range
range(len(fruits))を使わず要素数を決め打ちすると、増減したときにずれます。forループでの定番の間違いです。
直し方: 4 を 3 にします。
パターン4
1 nums = [1, 2, 3] 2 print(nums[-4]) ^
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(nums[-4])
~~~~^^^^
IndexError: list index out of range
負の添字は末尾からの位置を表しますが、要素数を超えて遡ることはできません。-1が最後、-3が最初です。
直し方: -4 を -1 にします。
パターン5
1 data = [10, 20, 30] 2 i = 0 3 while i <= len(data): ^ 4 print(data[i]) 5 i += 1
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(data[i])
~~~~^^^
IndexError: list index out of range
len(data)と同じ値は添字としては存在しません。<=にすると最後の1周で範囲外になります。
直し方: <= を < にします。
よくある誤解
「要素数と同じ数値まで使える」と思いがちですが、要素数3のリストで使える添字は0・1・2までです。range()の引数と添字の対応を混同すると起きやすいミスです。
実務での勘所
Pythonの添字は0からlen-1までの正の範囲だけでなく、-1(最後の要素)から-len(先頭の要素)までの負の範囲でもアクセスできます。この負の添字も範囲外に出ればIndexErrorになりますが、境界は-len(arr)までです。arr[-len(arr)-1]のように行き過ぎるとやはり例外になります。正の添字と負の添字は同じリストの表と裏のような関係で、arr[len(arr)-1]とarr[-1]は常に同じ要素を指します。
関連するエラー
- ZeroDivisionError: division by zero の原因と直し方0による除算・剰余算で発生する例外です。
- .lengthではなくlen()を使う理由という原因と直し方他言語の.lengthや.size()の感覚でPythonのコレクションを扱おうとしたときに出るエラーです。
- KeyError の原因と直し方辞書に存在しないキーへアクセスしたときに出るエラーです。