Объяснение ошибки 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