はじめに
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で値を取り出す時に発生したエラーについてでした。
リストはインデックスの範囲外をアクセスするとエラーになります。
プログラムでリストにループで値を入れている時なんかに、範囲の指定を間違えてよくこういったエラーが発生したりしますのでこういったメッセージが出たらリストの範囲をまず調べるのが良いかと思います。
この記事がお役に立ったのならば嬉しいです。
最後までお読みいただきありがとうございました。