EMZETT.
Войти

KeyError и IndexError (Python)

Коротко: В словаре отсутствует ключ (KeyError) или индекс списка лежит вне списка (IndexError).

Подробнее: Обе ошибки возникают при обращении к несуществующим элементам. Они родственны ArrayIndexOutOfBoundsException в Java.

Подробности

KeyError

age = {"Mia": 17}
print(age["Tom"])   # KeyError: 'Tom'

Ключа "Tom" нет в словаре. Опечатки и регистр тоже считаются. Решения:

  • age.get("Tom") возвращает None, age.get("Tom", 0) — значение по умолчанию.
  • Проверьте заранее: if "Tom" in age:.
  • Используйте collections.defaultdict или setdefault.
  • С данными JSON выведите фактические ключи (print(data.keys())).

IndexError

numbers = [10, 20, 30]
print(numbers[3])   # IndexError: list index out of range

Допустимые индексы — от 0 до len(список) - 1. Часто: ошибка на единицу в циклах (range(len(x)+1)), пустые списки, неверный индекс после удаления элементов. Решения:

  • Проверьте if i < len(numbers): или if numbers: для «не пусто».
  • Перебирайте через for n in numbers: вместо индексов.
  • Отрицательные индексы считаются с конца: numbers[-1].
  • try/except IndexError используйте только там, где отсутствие ожидаемо.

Поиск причины

Прочитайте номер строки в трассировке, выведите len() или ключи перед этой строкой и проверьте, действительно ли данные выглядят так, как вы думаете (пустой ответ, другая структура, None). Отладчик или print в нужном месте экономит много времени.

См. также: ArrayIndexOutOfBoundsException, TypeError, ModuleNotFoundError