Короткий ответ
Срез seq[start:stop:step] возвращает новую последовательность того же типа с элементами от индекса start (включительно) до stop (не включая), с заданным шагом; отрицательные индексы отсчитываются с конца, а отрицательный шаг разворачивает порядок.
Как это работает подробнее
Python вычисляет границы среза, нормализуя отрицательные индексы (прибавляя длину последовательности) и подставляя значения по умолчанию: start=0, stop=len(seq) для положительного шага (и наоборот для отрицательного), step=1. Результат — всегда новый объект-копия выбранных элементов, исходная последовательность не меняется.
Пример кода
example.py
s = "Backend"
print(s[1:4]) # "ack"
print(s[-3:]) # "end"
print(s[::-1]) # "dnekcaB" — разворот строки
nums = [0, 1, 2, 3, 4, 5]
print(nums[::2]) # [0, 2, 4]
print(nums[1:4]) # [1, 2, 3], индекс 4 не включён
copy_nums = nums[:] # полная поверхностная копия списка
copy_nums.append(99)
print(nums) # [0, 1, 2, 3, 4, 5] — исходный список не изменилсяЧто использовать на практике
- Практика. Частые идиомы:
seq[::-1]— разворот последовательности,seq[:n]— первые n элементов,seq[-n:]— последние n элементов,seq[::2]— каждый второй элемент. Для списков срез можно использовать и в левой части присваивания:lst[1:3] = [10, 20, 30]заменит два элемента тремя.
Подводные камни
- Риски. Путают, что stop не включается в результат (off-by-one ошибки). Также забывают, что срез списка — это поверхностная (shallow) копия: вложенные изменяемые объекты внутри остаются общими для исходного списка и срезанной копии.