Code Fix

初級

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]は常に同じ要素を指します。

演習をはじめる

関連するエラー

他の言語ではどうなるか

広告
広告スロット(未設定)