Короткий ответ
Отрицательные индексы нумеруют элементы с конца последовательности: -1 — последний элемент, -2 — предпоследний и так далее. Они поддерживаются всеми встроенными последовательностями и избавляют от вычисления длины при доступе к «хвосту» данных.
Как это работает подробнее
При положительной индексации отсчёт идёт от начала, при отрицательной — от конца коллекции.
- Сопоставление. Индекс
-1соответствует последнему элементу, а индекс, равный минус длине коллекции, — первому, поэтому фактический размер знать не нужно. - Поддержка. Отрицательная индексация работает для списков, кортежей и строк.
- Сочетание со срезами. Отрицательные индексы применимы и в срезах:
arr[-3:]возвращает три последних элемента, аarr[::-1]разворачивает последовательность.
Пример кода
Доступ к элементам с конца списка
arr = [10, 20, 30, 40]
print(arr[-1]) # 40 — последний элемент
print(arr[-2]) # 30 — предпоследний элемент
print(arr[-3:]) # [20, 30, 40]Что использовать на практике
- Последний элемент. Вместо
arr[len(arr) - 1]пишиarr[-1]: это короче, читаемее и не зависит от размера коллекции. - Хвост данных. Получай последние элементы очереди, конец строки и другие «хвостовые» данные отрицательными индексами.
- Срезы с конца. Бери блоки с конца последовательности через срезы с отрицательными границами.
Подводные камни
- Индекс -0. Отдельного индекса -0 не существует: это просто 0, то есть первый элемент.