Срезы списков в Python: пошаговый разбор для начинающих
Как достать первые три элемента, перевернуть список одной строкой и не выйти за границы. Разбираем синтаксис срезов Python на конкретных примерах — с проверкой результата после каждого шага.

К концу этого разбора вы сможете достать из списка любой кусок: первые три элемента, каждый второй, всё кроме последнего, перевёрнутую копию. На это уйдёт минут пятнадцать, если запускать примеры по ходу. Всё проверено на CPython 3.12, но синтаксис срезов не менялся годами и работает одинаково в любой версии Python 3.x.
Срез (slice) — это способ получить подпоследовательность из списка, не трогая оригинал. Пишется в квадратных скобках через двоеточие. Звучит сухо, поэтому дальше только рабочие примеры, которые вы копируете в интерпретатор и сразу видите результат.
Что нужно до начала
- Python 3.x — проверьте командой
python --versionв терминале, должно вывести что-то вродеPython 3.12.4. - Любой способ запускать код: интерактивный интерпретатор (наберите
pythonи жмите Enter), онлайн-песочница или файл.py. - Ничего устанавливать не нужно — срезы это часть языка, никаких библиотек.
Для примеров возьмём один список и не будем его менять:
# Список названий месяцев, индексы подписаны для удобства
months = ["янв", "фев", "мар", "апр", "май", "июн"]
# 0 1 2 3 4 5Шаг 1. Обычный индекс — фундамент
Прежде чем резать, вспомним про доступ по одному индексу. Нумерация начинается с нуля.
months = ["янв", "фев", "мар", "апр", "май", "июн"]
print(months[0]) # янв
print(months[2]) # марПроверка: в консоли появились строки янв и мар. Если вместо этого IndexError, значит вы обратились к индексу, которого нет — про это отдельно ниже.
Шаг 2. Базовый срез: от и до
Синтаксис — list[start:stop]. Берётся всё от start включительно до stop не включая. Именно это «не включая» и путает новичков.
months = ["янв", "фев", "мар", "апр", "май", "июн"]
print(months[1:4]) # ['фев', 'мар', 'апр']Индекс 1 вошёл, индекс 4 (май) — нет. Запомните формулу: количество элементов в срезе равно stop - start, то есть 4 - 1 = 3. Проверка: в выводе ровно три элемента, начиная с фев.
Пропуск границ
Любую границу можно опустить. Пустой start означает «с самого начала», пустой stop — «до самого конца».
months = ["янв", "фев", "мар", "апр", "май", "июн"]
print(months[:3]) # ['янв', 'фев', 'мар'] — первые три
print(months[3:]) # ['апр', 'май', 'июн'] — с четвёртого до конца
print(months[:]) # весь список — копияСрезmonths[:]— это не то же самое, чтоmonths. Он создаёт новый список с теми же элементами. Присвоениеcopy = monthsдаёт вторую ссылку на тот же объект, аcopy = months[:]— независимую копию верхнего уровня.
Шаг 3. Отрицательные индексы
Отрицательные числа отсчитываются с конца: -1 это последний элемент, -2 предпоследний.
months = ["янв", "фев", "мар", "апр", "май", "июн"]
print(months[-1]) # июн — последний
print(months[-2:]) # ['май', 'июн'] — два последних
print(months[:-1]) # ['янв', 'фев', 'мар', 'апр', 'май'] — всё кроме последнегоПроверка: months[:-1] вернул пять элементов, последний июн отрезан. Приём [:-1] удобен, когда нужно откинуть хвост, но вы не знаете точную длину списка.
Шаг 4. Шаг среза — третье двоеточие
Полная форма — list[start:stop:step]. Третье число задаёт шаг. По умолчанию шаг равен 1.
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[::2]) # [0, 2, 4, 6, 8] — каждый второй
print(numbers[1::2]) # [1, 3, 5, 7, 9] — каждый второй, начиная с индекса 1
print(numbers[2:8:3]) # [2, 5] — от 2 до 8, шаг 3Разворот списка
Отрицательный шаг идёт справа налево. Самый частый приём — [::-1] для разворота.
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[::-1]) # [5, 4, 3, 2, 1, 0]Это создаёт перевёрнутую копию. Если нужно развернуть сам список на месте, без копии — используйте метод numbers.reverse(), он ничего не возвращает и меняет исходный список. Выбор между ними — вопрос того, нужна вам копия или нет.
Шаг 5. Срез не падает за границей
Ключевое отличие среза от обычного индекса: срез не выбрасывает ошибку, если границы выходят за пределы списка. Он просто отдаёт столько, сколько есть.
months = ["янв", "фев", "мар"]
print(months[10]) # IndexError — обычный индекс падает
print(months[:10]) # ['янв', 'фев', 'мар'] — срез возвращает всё, что есть
print(months[5:10]) # [] — пустой список, ошибки нетИз-за этого срезы удобны, когда длина заранее неизвестна: data[:100] вернёт до ста элементов и не упадёт, даже если их всего десять.
Итоговая шпаргалка
| Запись | Что делает | Результат для [0,1,2,3,4] |
|---|---|---|
[2] | один элемент по индексу | 2 |
[1:3] | с 1 до 3 не включая | [1, 2] |
[:2] | первые два | [0, 1] |
[2:] | с индекса 2 до конца | [2, 3, 4] |
[-1] | последний элемент | 4 |
[:-1] | всё кроме последнего | [0, 1, 2, 3] |
[::2] | каждый второй | [0, 2, 4] |
[::-1] | перевёрнутая копия | [4, 3, 2, 1, 0] |
Если не получилось
TypeError: list indices must be integers or slices, not str— вы передали в скобки строку или дробное число. Индексы и границы среза должны быть целыми:months[0], а неmonths["0"].- Срез вернул пустой список
[]— скорее всегоstartбольше или равенstopпри положительном шаге. Например,months[3:1]даёт пусто. Для обратного порядка нужен отрицательный шаг:months[3:1:-1]. - Ожидали копию, а меняется оригинал — вы написали
copy = monthsвместоcopy = months[:]. Первое даёт ссылку на тот же список. - Разворот через
reverse()вернулNone— методreverse()меняет список на месте и ничего не возвращает. Не пишитеresult = months.reverse(). Для копии используйтеmonths[::-1].
Что дальше
Срезы работают не только со списками. Тот же синтаксис применим к строкам ("привет"[::-1] вернёт "тевирп") и кортежам. С range и генераторами срез в квадратных скобках не работает — там понадобится itertools.islice, это отдельная тема. Следующий шаг — присваивание в срез (months[1:3] = ["x", "y"]), которое меняет список кусками; попробуйте его в интерпретаторе и посмотрите, как ведёт себя длина списка при замене на разное число элементов.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: Python docs — Sequence Types: Common Sequence Operations (slicing), Python Tutorial — Lists
Частые вопросы
Работают ли срезы одинаково во всех версиях Python 3?
Почему last включается, а stop нет?
Срез создаёт копию или ссылку на исходный список?
Что делать, если срез вернул не то, что я ждал?
Как развернуть список без создания копии?
Можно ли применить срез к строке или только к списку?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.