Срезы в Python: полное руководство для новичков
Срезы (slices) в Python — это механизм, который позволяет извлекать фрагменты из последовательностей вроде строк, списков или кортежей. Представьте, что у вас есть колбаса (извините за банальность, но аналогия работает) — срез позволяет отрезать от неё кусочек, не повреждая остальную часть.

Главная фишка срезов в том, что они создают новый объект с выбранными элементами, оставляя исходный объект нетронутым. Это как снять копию со страницы книги — оригинал остается на месте, а у вас появляется отдельный фрагмент для работы.
Зачем это нужно на практике? Допустим, вы парсите логи сервера и вам нужно выцепить timestamp из каждой строки. Или обрабатываете пользовательский ввод и хотите убрать первые и последние символы. Срезы делают такие задачи элегантными и читаемыми — вместо циклов и условий вы пишете одну лаконичную строчку кода.
- Синтаксис срезов: коротко и наглядно
- Как работают срезы на разных типах данных
- Практика: частые приёмы работы со срезами
- Как работают отрицательные значения в срезах
- Ошибки при работе со срезами
- Дополнительно: объект slice()
- Чеклист: 10 полезных шаблонов срезов
- Заключение
- Рекомендуем посмотреть курсы по Python
Синтаксис срезов: коротко и наглядно
Общий синтаксис среза выглядит как iterable[start:stop:step] — три параметра через двоеточие в квадратных скобках. Звучит просто, но дьявол, как всегда, кроется в деталях.
Параметр | Что делает | По умолчанию | Пример |
---|---|---|---|
start | Индекс начала (включительно) | 0 | [2:] — с третьего элемента |
stop | Индекс конца (не включается!) | len(объекта) | [:5] — до пятого элемента |
step | Шаг между элементами | 1 | [::2] — каждый второй |
Самая частая ошибка новичков — забыть, что stop не включается в результат. Если пишете [1:4], получите элементы с индексами 1, 2 и 3, но не 4. Это как бронировать отель с 15 по 18 число — выезжаете утром 18-го, а не остаетесь на эту ночь.
Ещё один подводный камень — отрицательный step. Когда указываете [::-1], Python идёт от конца к началу, но логика start и stop остается той же. Поэтому [3:1:-1] работает (идём от 3-го к 1-му назад), а [1:3:-1] возвращает пустой список — ведь нельзя идти назад от меньшего индекса к большему.
Как работают срезы на разных типах данных
Срезы в строках
Со строками срезы работают как скальпель хирурга — точно и аккуратно вырезают нужные символы. Классический пример: у вас есть email «user@domain.com», и нужно выцепить домен.
email = "user@domain.com" domain = email[email.find('@')+1:] # domain.com
Или берёте первые четыре символа из имени пользователя: email[:4] даст «user». Строки неизменяемы, поэтому срез всегда создаёт новую строку.
Срезы в списках
Списки — это где срезы раскрываются во всей красе. Можно не только извлекать элементы, но и заменять целые куски:
numbers = [1, 2, 3, 4, 5] numbers[1:4] = ['два', 'три', 'четыре'] # Заменили средние элементы.
Копирование списка через [:] — классика жанра. Оно создаёт поверхностную копию (shallow copy).замена через срез

Сравнение состояния списка до и после применения среза numbers[1:4] = [‘два’, ‘три’, ‘четыре’]. Иллюстрация подчёркивает, что срез позволяет заменить сразу несколько элементов — даже на список другой длины.
Что такое поверхностная копия? Это значит, что создаётся новый список, но его элементы — это ссылки на те же объекты, что и в оригинале. Если у вас в списке лежат простые типы (числа, строки), всё работает ожидаемо. Но если там вложенные списки, изменение такого списка в копии затронет и оригинал!
Срезы в кортежах
Кортежи ведут себя как строки — неизменяемые, поэтому срез только извлекает данные. Никаких присваиваний через срезы тут не прокатит.
Тип данных | Изменяемость | Операции через срезы |
---|---|---|
Строки | Неизменяемые | Только извлечение |
Списки | Изменяемые | Извлечение + замена + удаление |
Кортежи | Неизменяемые | Только извлечение |
Основное различие в том, что с изменяемыми типами (списки) срезы становятся мощным инструментом редактирования, а с неизменяемыми — просто способом получить фрагмент данных.
Практика: частые приёмы работы со срезами
Теперь к мясу — к тем паттернам, которые вы будете использовать ежедневно. Это как набор отмычек для опытного взломщика — каждый инструмент для своей задачи.
Копирование: [:]
original = [1, 2, 3, 4, 5] copy = original[:] # Поверхностная копия original.append(6) # original изменился, copy -- нет
Оба способа, [:] и list(), являются высокоэффективными для создания поверхностной копии. Выбор между ними — чаще вопрос стиля кода, а не производительности. Правда, для вложенных структур понадобится copy.deepcopy().
Обрезка с начала и конца: [:3], [3:]
log_line = "2024-01-15 ERROR: Database connection failed" date = log_line[:10] # "2024-01-15" message = log_line[11:] # "ERROR: Database connection failed"
Классика для парсинга логов, обработки CSV или любых структурированных данных.
Выбор с шагом: [::2]
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] even = numbers[::2] # [0, 2, 4, 6, 8] -- чётные позиции odd = numbers[1::2] # [1, 3, 5, 7, 9] -- нечётные позиции
Удобно для фильтрации данных по паттерну или извлечения каждого N-го элемента.
Реверс: [::-1]
word = "Python" reversed_word = word[::-1] # "nohtyP"
Это самый элегантный и прямой способ создать новую перевёрнутую строку. В отличие от него, функция reversed(word) создаёт итератор, который нужно дополнительно преобразовать в строку (например, через «».join(reversed(word))).
Замена и удаление через срезы:
data = [1, 2, 3, 4, 5, 6] # Заменяем 3 элемента на 2 data[1:4] = ['A', 'B'] # [1, 'A', 'B', 5, 6] # Удаляем каждый второй элемент из изменённого списка del data[::2] # ['A', 5]
Это где срезы показывают свою истинную мощь — одной строкой делаете то, на что раньше нужен был цикл.
Запомните это:
- [:] — полная копия.
- [1:] — всё кроме первого.
- [:-1] — всё кроме последнего.
- [::-1] — разворот.
- [::2] — каждый второй.
Как работают отрицательные значения в срезах
Отрицательные индексы в Python — это как система координат, где можно считать не только от начала массива, но и от его конца. Представьте очередь: можете считать людей от входа (0, 1, 2…) или от выхода (-1, -2, -3…).индексы Python
Классический пример со строкой «Python»:
Прямые индексы: 0 1 2 3 4 5 Символы: P y t h o n Обратные индексы: -6 -5 -4 -3 -2 -1
Когда пишете text[-3:], получаете последние три символа — «hon». А text[:-2] даёт всё, кроме двух последних — «Pyth».
Отрицательный step переворачивает логику движения. text[::-1] идёт от конца к началу с шагом 1, давая полный реверс. А text[-2::-2] стартует с предпоследнего символа и движется к началу, беря каждый второй — получится «ohP».
Такой подход особенно удобен, когда нужно работать с концом последовательности, не зная её длины заранее. Вместо text[len(text)-3:] просто пишете text[-3:] — читается проще и меньше шансов ошибиться в арифметике.
Важный момент: срез [:-1] не удаляет последний элемент, а создаёт копию без него. Исходный объект при этом не меняется.
my_list = [10, 20, 30] new_list = my_list[:-1] # Создали новый список print(f"Исходный список: {my_list}") # -> Исходный список: [10, 20, 30] print(f"Новый список: {new_list}") # -> Новый список: [10, 20]
Чтобы удалить последний элемент из изменяемого объекта (например, списка), используется оператор del:
del my_list[-1] print(f"Изменённый список: {my_list}") # -> Изменённый список: [10, 20]
Ошибки при работе со срезами
Срезы кажутся простыми, пока не наступаете на классические грабли. Вот топ-лист того, что заставляет разработчиков материться в три часа ночи:
Ошибка: step = 0
text[::0] # ValueError: slice step cannot be zero
Как правильно: Python не умеет делать шаг нулевой длины — это как стоять на месте и пытаться идти. Минимальный шаг — 1 или -1.ошибка step=0

oshibka-step0
Попытка использовать text[::0] вызывает ValueError, потому что шаг среза не может быть равен нулю. Эта визуализация подчёркивает одно из редких, но важных исключений при работе со срезами.
Ошибка: ожидание IndexError при выходе за границы
text = "hello" print(text[10:20]) # Ожидаете ошибку? А получите ""
Как правильно: срезы «всепрощающие» — они просто возвращают то, что могут найти. Хотите строгую проверку — используйте обычную индексацию.
Ошибка: забытый отрицательный step при обратном движении
text[3:1] # Пустая строка -- нельзя идти вперёд от большего к меньшему text[3:1:-1] # "th" -- вот теперь работает
Как правильно: при движении назад всегда указывайте отрицательный step.
Ошибка: непонимание, почему [::-1] работает как реверс
# start и stop по умолчанию меняются местами при отрицательном step text[::-1] # Аналогично text[len(text)-1::-1]
Как правильно: при step < 0 Python автоматически ставит start=конец, stop=начало.
Ошибка: путаница с присваиванием срезов разной длины
data = [1, 2, 3, 4, 5] data[1:3] = [10] # [1, 10, 4, 5] -- заменили 2 элемента одним
Как правильно: это фича, а не баг. Срезы могут менять размер списка.
Дополнительно: объект slice()
Помимо привычных квадратных скобок, Python предлагает более явный способ создания срезов через функцию slice(). Это как переход от сленга к официальному языку — иногда полезно для ясности кода.
# Классический способ text = "Python programming" result1 = text[7:18:2] # Через slice() my_slice = slice(7, 18, 2) result2 = text[my_slice] # Тот же результат
Зачем это нужно? Во-первых, читаемость — slice(start=1, stop=5, step=2) понятнее, чем [1:5:2], особенно когда параметры вычисляются динамически. Во-вторых, переиспользование — можете сохранить объект среза и применять к разным последовательностям.

Показано, как срез slice(7, 18, 2) применяется к строке «Python programming». Результат — это строка «pormr» — подчёркивает удобство явного объявления среза и его переиспользуемость.
Классический случай — когда логика среза сложная и повторяется:
# Выделяем каждую вторую строку, пропуская заголовок data_slice = slice(1, None, 2) csv_rows = lines[data_slice] log_entries = logs[data_slice]
Объект slice хранит свои параметры в атрибутах .start, .stop, .step — удобно для отладки или динамической модификации. Правда, в повседневной работе квадратные скобки встречаются чаще — они короче и привычнее.
Чеклист: 10 полезных шаблонов срезов
Шаблон | Пояснение |
---|---|
[:] | Полная копия объекта |
[1:] | Всё, кроме первого элемента |
[:-1] | Всё, кроме последнего элемента |
[::-1] | Разворот последовательности |
[::2] | Каждый второй элемент |
[1::2] | Каждый второй, начиная с первого (нечётные позиции) |
[-3:] | Последние три элемента |
[1:-1] | Без первого и последнего |
[:5] | Первые пять элементов |
[::3] | Каждый третий элемент |
Эти десять паттернов покрывают примерно 90% случаев использования срезов в реальной разработке. Запомните их — и будете писать код быстрее и элегантнее.
Особенно часто встречаются первые пять: копирование, обрезка краёв, реверс и выбор с шагом. Остальные — для специфических задач вроде пагинации ([:5] для первой страницы) или работы с концом данных ([-3:] для последних записей лога).
Заключение
Срезы в Python — это один из тех инструментов, который делает код не просто функциональным, а элегантным. Вместо громоздких циклов и условий вы получаете лаконичные однострочники, которые делают именно то, что нужно. Подведем итоги:
- Срезы — мощный инструмент Python для манипуляции последовательностями. Они делают код лаконичным и читаемым, сокращая объём ручной обработки данных.
- Синтаксис
start:stop:step
имеет особенности, которые нужно запомнить. Например,stop
не включается в результат, а шаг может быть отрицательным. - Отрицательные значения позволяют работать с концом последовательности и реверсировать её. Это делает срезы особенно гибкими при работе с динамическими структурами.
- Списки, строки и кортежи ведут себя по-разному — особенно при изменении значений. Стоит помнить, что строки и кортежи — неизменяемы, а списки можно модифицировать.
- Через срез можно упростить парсинг, фильтрацию, клонирование и модификацию. Это особенно полезно при обработке больших массивов данных.
- Объект
slice()
помогает создавать срезы программно и передавать их в функции. Это открывает возможности для более универсального и переиспользуемого кода.
Только начинаете осваивать Python? Рекомендуем обратить внимание на подборку курсов по Python — в них вы найдёте и теоретические разборы, и практику в задачах, включая работу со срезами, списками и строками.
Рекомендуем посмотреть курсы по Python
Курс | Школа | Цена | Рассрочка | Длительность | Дата начала | Ссылка на курс |
---|---|---|---|---|---|---|
Python — программист с нуля
|
Merion Academy
5 отзывов
|
Цена
15 900 ₽
26 500 ₽
|
От
1 325 ₽/мес
Рассрочка на 12 месяцев
|
Длительность
4 месяца
|
Старт
24 августа
|
Ссылка на курс |
Профессия Python-разработчик
|
Eduson Academy
66 отзывов
|
Цена
Ещё -5% по промокоду
103 900 ₽
|
От
8 658 ₽/мес
|
Длительность
6 месяцев
|
Старт
21 августа
|
Ссылка на курс |
Профессия Python-разработчик
|
ProductStar
38 отзывов
|
Цена
Ещё -31% по промокоду
165 480 ₽
299 016 ₽
|
От
6 895 ₽/мес
|
Длительность
10 месяцев
|
Старт
в любое время
|
Ссылка на курс |
Курс Go-разработчик (Junior)
|
Level UP
35 отзывов
|
Цена
45 500 ₽
|
От
11 375 ₽/мес
|
Длительность
3 месяца
|
Старт
27 сентября
|
Ссылка на курс |
Профессия Python-разработчик
|
Skillbox
149 отзывов
|
Цена
Ещё -20% по промокоду
67 750 ₽
135 500 ₽
|
От
5 646 ₽/мес
9 715 ₽/мес
|
Длительность
12 месяцев
|
Старт
23 августа
|
Ссылка на курс |

Waterfall vs Agile: что лучше для вашего проекта?
Выбор между Waterfall и Agile — это не просто вопрос предпочтений, а стратегическое решение, влияющее на успех проекта. Какой метод лучше подходит для вашей задачи? Разбираемся!

Безопасность в веб-разработке: чего опасаться и как защищаться
Почему SQL-инъекции и XSS остаются угрозами? Какие меры помогут их предотвратить? В статье раскрыты лучшие практики безопасности и полезные инструменты.

Scikit-learn и машинное обучение: как Python делает магию реальностью
Хотите прокачать навыки машинного обучения на Python? Библиотека Scikit-learn — это не просто комбайн алгоритмов, а инструмент, без которого не обойтись в Data Science. Разбираем всё — от установки до первых моделей.

Создание идеальной Wi-Fi сети: что важно знать?
Проектирование беспроводной сети — это не просто установка точек доступа. Узнайте, как спланировать сеть, чтобы избежать проблем и обеспечить стабильность.