IndexError: pop index out of range

Python
本ページはプロモーションが含まれています

はじめに

ptyhonでリストへの操作をしているとエラーが発生。
リストはどのプログラムでよく使う&今回のエラーはよく出るものなので、今回メモとして残すことにしました。

エラー&ソース

エラーが発生したのはリストの要素をpopで削除した時に起きた時です。
今回はその時の再現として、簡単なサンプルソースを↓に貼ります。

l = ["1", "2", "3", "4", "5"]
print(len(l))
print(l)

# popで3番目の要素を削除する
l.pop(2)
print(len(l))
print(l)

# popで最後の要素を削除する
l.pop(len(l))
print(len(l))
print(l)

これを実行すると

5
['1', '2', '3', '4', '5']
4
['1', '2', '4', '5']
Traceback (most recent call last):
File "/Users/****/python/idx_error.py", line 11, in <module>
l.pop(len(l))
IndexError: pop index out of range

とエラーになります。

エラーメッセージ「IndexError: pop index out of range」は、

「popしたインデックス(要素)は(リストの)範囲外です」

と言っています。

原因

エラーから想像出来ますが、リストの範囲外を指定しているからです。
サンプルのソースではlenでリストの長さを取得しています。

ただリストのインデックスは0から始まるので、lenの長さを指定してしまうと範囲外をアクセスしたとしてエラーに。

11行目でのリストの値は次になります。
リストの値    :1, 2, 4, 5
インデックス:0, 1, 2, 3
lenの戻り値   :4

len(l)にすると4番目のインデックスとなるのでエラーになったという訳です。
popで末尾を取得するなら「len(l)-1」としないといけません。

ソースを直したものは↓になります。

l = ["1", "2", "3", "4", "5"]
print(len(l))
print(l)

# popで3番目の要素を削除する
l.pop(2)
print(len(l))
print(l)

# popで最後の要素を削除する
l.pop(len(l)-1)
print(len(l))
print(l)

これを実行すると

5
['1', '2', '3', '4', '5']
4
['1', '2', '4', '5']
3
['1', '2', '4']

という風にプログラムが最後まで実行されます。

さいごに

今回はリストをpopで値を取り出す時に発生したエラーについてでした。
リストはインデックスの範囲外をアクセスするとエラーになります。
プログラムでリストにループで値を入れている時なんかに、範囲の指定を間違えてよくこういったエラーが発生したりしますのでこういったメッセージが出たらリストの範囲をまず調べるのが良いかと思います。

この記事がお役に立ったのならば嬉しいです。
最後までお読みいただきありがとうございました。

タイトルとURLをコピーしました