Что такое ошибка IndexError?

Ошибка IndexError: list index out of range возникает, когда код пытается получить доступ к элементу списка по индексу, который выходит за границы списка.

Причины возникновения

  • Индекс больше или равен длине списка
  • Отрицательный индекс больше длины списка
  • Список пустой
  • Ошибка в логике циклов

Как отладить ошибку

  1. Проверь длину списка - используй len(list)
  2. Выведи содержимое и индексы - добавь print() для отладки
  3. Проверь границы циклов - убедись в правильности range()
  4. Отследи изменение списка - список может изменяться во время итерации

Как исправить ошибку

1. Проверяй границы перед доступом

 1# Неправильно
 2my_list = [1, 2, 3]
 3print(my_list[5])  # IndexError
 4
 5# Правильно
 6my_list = [1, 2, 3]
 7if 5 < len(my_list):
 8    print(my_list[5])
 9else:
10    print("Индекс выходит за границы")

2. Используй enumerate() для безопасной итерации

1my_list = [1, 2, 3, 4, 5]
2for index, value in enumerate(my_list):
3    print(f"Индекс {index}: значение {value}")

3. Обрабатывай пустые списки

1def safe_get_first(items):
2    if not items:  # проверка на пустой список
3        return None
4    return items[0]

4. Используй метод get() для словарей

1my_dict = {"a": 1, "b": 2}
2value = my_dict.get("c", "значение по умолчанию")

Как мониторить подобные ошибки

  • Используй линтеры для обнаружения потенциальных проблем
  • Пиши тесты с граничными случаями
  • Используй type hints для документирования типов
  • Логируй ошибки для анализа

FAQ

В: Как безопасно получить последний элемент списка?

О: Используй list[-1] или list[len(list)-1], но сначала проверь, что список не пустой.

В: Что делать при итерации с удалением элементов?

О: Итерируйся в обратном порядке или создай копию списка для итерации.

В: Как избежать IndexError в Django QuerySet?

О: Используй first(), last() или проверяй результат filter().

Лучшие практики

  • Всегда проверяй границы перед доступом к элементам
  • Используй enumerate() вместо range(len())
  • Обрабатывай пустые коллекции явно
  • Используй try-except для обработки исключений
  • Пиши defensive programming