Объяснение ошибки IndexError в Python: индекс списка выходит за пределы допустимого диапазона

В этом руководстве вы узнаете все о ошибке выхода за пределы списка в Python, включая то, что это такое, почему она возникает и как ее исправить.

IndexError - одна из самых распространенных ошибок времени выполнения в Python, с которыми вы столкнетесь в своем программировании. По большей части эти ошибки довольно легко исправить, как только вы поймете, почему они возникают.

В этом руководстве вы узнаете, почему возникает ошибка, и рассмотрите некоторые сценарии, в которых вы можете с ней столкнуться. Вы также узнаете, как устранить ошибку в этих сценариях

Оглавление

Что такое индексная ошибка Python?

Давайте уделим немного времени исследованию ошибки IndexError в Python и посмотрим, как она выглядит. Когда вы столкнетесь с этой ошибкой, вы увидите следующее сообщение об ошибке:

IndexError: list index out of range

Мы можем немного разобрать текст. Мы видим здесь, что сообщение сообщает нам, что индекс вне диапазона. Это означает, что мы пытаемся получить доступ к элементу списка в Python, который находится вне диапазона, что значит, что элемент не имеет позиции индекса.

Элемента, у которого нет индексной позиции в списке Python, попросту не существует.

В Python, как и во многих других языках программирования, индекс списка начинается с позиции 0 и продолжается до n-1, где n — это длина списка (или количество элементов в этом списке).

Это вызывает довольно распространенную ошибку. Предположим, мы работаем со списком из 4 элементов. Если мы захотим получить доступ к четвертому элементу, вы можете попробовать использовать индекс 4. Однако это вызовет ошибку. Это потому, что четвертый элемент на самом деле имеет индекс 3.

Давайте посмотрим на пример списка и попробуем получить доступ к элементу, который не существует:

# How to raise an IndexError
a_list = ['welcome', 'to', 'datagy']
print(a_list[3])

# Returns:
# IndexError: list index out of range

Можно заметить, что ошибка индексации возникает на последнем элементе, к которому мы пытаемся получить доступ.

Самое простое решение - просто не пытаться получить доступ к несуществующему элементу. Но это легче сказать, чем сделать. Как предотвратить возникновение IndexError? В следующих двух разделах вы узнаете, как предотвратить эту ошибку в наиболее распространенных ситуациях: циклах for в Python и циклах while в Python.

Хотите проверить, существует ли ключ в словаре Python? Ознакомьтесь с этим руководством, которое обучает пяти различным способам проверки существования ключа в словаре Python, включая возврат значения по умолчанию.

Индексная ошибка Python с циклом For

Вы можете столкнуться с ошибкой IndexError в Python при выполнении цикла for. Это особенно часто происходит, когда вы пытаетесь проитерировать список, используя range()

Давайте рассмотрим ситуацию, в которой возникает эта ошибка:

# How to raise an IndexError with a For Loop
a_list = ['welcome', 'to', 'datagy']

for i in range(len(a_list) + 1):
    print(a_list[i])

# Returns:
# welcome
# to
# datagy
# Traceback (most recent call last):
# IndexError: list index out of range

Способ исправить эту ошибку заключается в том, чтобы прекратить итерацию до того, как список исчерпает свои элементы. Для этого изменим наш цикл for, чтобы он проходил до длины списка, а не до длины + 1. Это позволит нам прекратить итерацию по индексам списка до достижения значения длины.

Это решает проблему IndexError, поскольку приводит к остановке итерации списка на позиции length - 1, так как наш индекс начинается с 0, а не с 1.

Давайте посмотрим, как мы можем изменить код, чтобы он работал правильно:

# How to prevent an IndexError with a For Loop
a_list = ['welcome', 'to', 'datagy']

for i in range(len(a_list)):
    print(a_list[i])

# Returns:
# welcome
# to
# datagy

Теперь, когда вы поняли, как устранить ошибку IndexError в цикле for на Python, давайте посмотрим, как можно устранить эту ошибку в цикле while.

Ошибка индекса Python с циклом while

Вы также можете столкнуться с ошибкой IndexError в Python при выполнении цикла

Например, может возникнуть соблазн использовать цикл while для прохода по каждому индексу списка. Вы можете, например, написать программу, которая выглядит следующим образом:

# How to raise an IndexError with a While Loop
a_list = ['welcome', 'to', 'datagy']

i = 0
while i <= len(a_list):
    print(a_list[i])
    i += 1

# Returns:
# welcome
# to
# datagy
# IndexError: list index out of range

Причина, по которой эта программа не работает, заключается в том, что мы проходим по списку на один раз больше, чем нужно. Это происходит потому, что мы используем <= (знак "меньше или равно"). Поскольку индексы списков в Python начинаются с 0, их максимальный индекс равен количеству элементов в списке минус 1.

Мы можем решить эту проблему, просто изменив оператор на символ "меньше", <. Это предотвратит выход индекса за пределы диапазона в цикле.

# How to prevent an IndexError with a While Loop
a_list = ['welcome', 'to', 'datagy']

i = 0
while i < len(a_list):
    print(a_list[i])
    i += 1

# Returns:
# welcome
# to
# datagy

В следующем разделе вы узнаете лучший способ перебора списка в Python, чтобы предотвратить ошибку IndexError.

Хотите узнать больше о f-строках в Python? Ознакомьтесь с моим подробным руководством, которое включает пошаговое видео для освоения f-строк в Python!

Как исправить ошибку индексирования Python

Есть два простых способа обойтись без ошибки IndexError при итерации по списку в Python.

Первый способ — очень простой способ перебора списка. Нам не обязательно нужен индекс для итерации по списку. Мы можем просто получать доступ к его элементам напрямую.

# Prevent an IndexError
a_list = ['welcome', 'to', 'datagy']

for word in a_list:
    print(word)

# Returns:
# welcome
# to
# datagy

Это напрямую предотвращает выход Python за пределы максимального индекса.

Хотите узнать, как использовать функцию Python zip() для перебора двух списков? Этот урок расскажет вам, что именно делает функция zip() и покажет несколько творческих способов её использования.

Но что, если вам нужно получить доступ к индексу списка?

Если вам нужно получить доступ к индексу списка и элементу списка, то гораздо более безопасной альтернативой является использование функции Python enumerate()

При передаче списка в функцию enumerate() возвращается объект enumerate. Это позволяет получить как индекс, так и элемент для каждого элемента списка. Функция неявно останавливается на максимальном индексе, но позволяет получить достаточно много информации.

Давайте посмотрим, как мы можем использовать функцию enumerate(), чтобы предотвратить ошибку IndexError в Python.

# Prevent an IndexError with enumerate()
a_list = ['welcome', 'to', 'datagy']

for idx, word in enumerate(a_list):
    print(idx, word)

# Returns:
# 0 welcome
# 1 to
# 2 datagy

Здесь видно, что цикл останавливается до того, как индекс выходит за пределы диапазона, тем самым предотвращая ошибку Python IndexError.

Заключение

В этом уроке вы узнали, как понять ошибку Python IndexError: list item out of range. Вы узнали, почему возникает эта ошибка, включая некоторые общие сценарии, такие как циклы for и while. Вы также узнали более правильные способы итерации по списку Python, например, итерацию по элементам неявно, а также использование функции Python enumerate()

Чтобы узнать больше о Python IndexError, ознакомьтесь с официальной документацией здесь

Last updated