Python для новичковКоллекцииСписок: создание, индексы и срезы

Список: создание, индексы и срезы

Уроки курсаСписок: создание, индексы и срезы

Срез списка [start:stop:step]: синтаксис и примеры

Индекс даёт доступ к одному элементу. Срез — к нескольким сразу. Результатом среза всегда является новый список, а исходный остаётся нетронутым.

Синтаксис: lst[start:stop:step], где:

  • start — позиция, с которой начинается выборка (элемент включается);
  • stop — позиция, на которой выборка заканчивается (элемент не включается);
  • step — шаг между позициями.

Любой из трёх параметров можно опустить. По умолчанию start = 0, stop = конец списка, step = 1.

Разберём на конкретном списке:

lst = [0, 1, 2, 3, 4, 5]

print(lst[1:4])   # [1, 2, 3]  — элементы с позиции 1 до 3 (4 не входит)
print(lst[::2])   # [0, 2, 4]  — каждый второй элемент от начала до конца
print(lst[1:5:2]) # [1, 3]     — каждый второй в диапазоне 1..4

Граница stop не включается — это то же правило, что и в range(start, stop). Если написать lst[1:4], Python берёт позиции 1, 2, 3, но не 4. Поначалу это сбивает с толку, но логика одна: stop - start при шаге 1 всегда равно количеству элементов в срезе.

Опущенные параметры работают предсказуемо:

print(lst[:3])   # [0, 1, 2]      — от начала до позиции 2
print(lst[3:])   # [3, 4, 5]      — от позиции 3 до конца
print(lst[:])    # [0, 1, 2, 3, 4, 5]  — копия всего списка

lst[:] — стандартный способ сделать поверхностную копию списка. Оригинал и копия — два разных объекта.

Отрицательные границы в срезе работают так же, как отрицательные индексы при одиночном обращении — они считаются с конца:

print(lst[-3:])   # [3, 4, 5]  — последние три элемента
print(lst[:-2])   # [0, 1, 2, 3]  — всё, кроме последних двух

lst[-3:] удобно читать как «дай мне хвост длиной три элемента» — и длину списка при этом знать не нужно.

Отрицательный шаг разворачивает направление обхода. При step = -1 Python идёт от start к stop в обратную сторону, поэтому start должен быть правее stop (или оба опущены):

print(lst[::-1])     # [5, 4, 3, 2, 1, 0]  — весь список в обратном порядке
print(lst[4:1:-1])   # [4, 3, 2]  — от позиции 4 до позиции 2 включительно, назад

lst[::-1] — самый компактный способ перевернуть список. Он возвращает новый список в обратном порядке, исходный не трогает.

Важное отличие среза от обращения по индексу: срез никогда не бросает IndexError, даже если границы выходят за пределы списка. Python просто молча обрезает диапазон до допустимого:

print(lst[1:100])  # [1, 2, 3, 4, 5]  — stop обрезается до конца списка
print(lst[10:20])  # []  — диапазон вне списка, возвращается пустой список

Это полезно знать: если срез вернул пустой список, это не ошибка — просто диапазон не попал ни в один элемент.