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