Ошибка TypeError: list indices must be integers or slices, not list
— частая проблема в программировании на Python, с которой сталкиваются как новички, так и опытные разработчики. Эта ошибка возникает, когда вы пытаетесь получить доступ к элементу списка, используя что-либо, кроме целочисленного индекса (или среза, который представляет собой диапазон целых чисел). Это руководство разберет основные причины этой ошибки и предложит практические решения.
Содержание
Понимание ошибки
Списки Python — это упорядоченные коллекции. Для доступа к отдельным элементам требуется их индекс, начиная с 0. Например, в my_list = [10, 20, 30]
, my_list[0]
возвращает 10, my_list[1]
возвращает 20 и так далее. Ошибка TypeError
означает, что вы использовали значение, не являющееся целым числом (или срезом), в качестве индекса, например, список, кортеж, строку или другой тип данных.
Распространенные причины и решения
1. Неправильное индексирование вложенных списков
Это распространенный сценарий. Рассмотрим:
my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(my_list[0]) # Вывод: [1, 2, 3] - Верно
print(my_list[[0,1]]) # TypeError! Неверно
print(my_list[0][1]) # Вывод: 2 - Верный доступ к вложенному элементу
my_list[[0,1]]
неверно использует [0,1]
в качестве индекса. Доступ к вложенным элементам осуществляется последовательно: my_list[0][1]
правильно извлекает элемент с индексом 1 внутри списка с индексом 0.
2. Использование переменных, содержащих списки, в качестве индексов
my_list = [10, 20, 30]
index = [1] # index — это список!
print(my_list[index]) # TypeError!
Здесь index
содержит список, который неверно используется в качестве индекса. Убедитесь, что ваша переменная индекса содержит целое число:
my_list = [10, 20, 30]
index = 1
print(my_list[index]) # Вывод: 20 - Верно
3. Неверные типы переменных
Любой индекс, не являющийся целым числом (строки, числа с плавающей точкой и т. д.), вызовет эту ошибку.
my_list = [10, 20, 30]
print(my_list["0"]) # TypeError! (Индекс-строка)
print(my_list[1.0]) # TypeError! (Индекс-число с плавающей точкой)
4. Ошибка на единицу
Индексы списка начинаются с 0. Доступ за пределы длины списка вызывает ошибку IndexError
; отрицательные индексы за пределами допустимого диапазона также вызывают ошибки. Всегда проверяйте свою логику индексирования.
Стратегии отладки
- Выведите ваши индексы: Перед использованием индекса выведите его значение, чтобы убедиться, что это целое число.
- Используйте отладчик: Проходите по коду построчно, проверяя значения переменных, чтобы определить источник ошибки.
- Проверьте вложенные списки: Внимательно изучите, как вы обращаетесь к элементам во вложенных списках.
Понимая эти причины и внимательно проверяя индексирование вашего кода, вы можете эффективно решить эту распространенную проблему Python. Всегда используйте целые числа (или срезы) при доступе к элементам списка.