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