Справочник по Python · модуль 3 · списки и циклы
Глава 3.8
Срезы в Python
Срез выбирает сразу несколько элементов последовательности. Три позиции — начало, граница и шаг — позволяют получить диапазон, каждый второй элемент или последовательность в обратном порядке.
- Категория
- Последовательности
- Уровень
- Средний
- Связанные темы
- Списки, строки, индексы
- Зачем это знать
- Выбирать, заменять и копировать части данных
§1Что такое срез
Срез — выбор части последовательности по записи sequence[start:stop:step]. Обычный срез создаёт новую последовательность и не меняет исходную.
| Часть | Смысл | По умолчанию |
|---|---|---|
start | индекс первого выбранного элемента | начало последовательности |
stop | граница, которая не входит в результат | конец последовательности |
step | шаг между элементами | 1 |
§2Начало входит, граница не входит
В срезе [1:4] элемент с индексом 1 попадёт в результат, а элемент с индексом 4 уже нет.
numbers = [10, 20, 30, 40, 50] result = numbers[1:4] print(result)
[20, 30, 40]
- попадает в результат
- остаётся за границей среза
Схема объясняет правило нагляднее словесной формулировки: числа в квадратных скобках указывают не на элементы, а на границы между ними. Срез забирает всё, что лежит между границей 1 и границей 4, — отсюда и три элемента, и невключение stop. Из той же линейки видно, почему numbers[1:4] и numbers[-4:-1] дают одно и то же.
§3Шаг среза
Третья позиция задаёт расстояние между выбранными элементами. Пропущенные start и stop означают всю последовательность.
numbers = [1, 2, 3, 4, 5, 6] print(numbers[::2]) print(numbers[1::2])
[1, 3, 5] [2, 4, 6]
§4Отрицательные индексы
Отрицательные индексы отсчитываются с конца: -1 — последний элемент, -2 — предпоследний. Срез [-3:] выбирает последние три элемента.
numbers = [10, 20, 30, 40, 50] print(numbers[-3:])
[30, 40, 50]
§5Обратный порядок
Отрицательный шаг идёт справа налево. Запись [::-1] создаёт перевёрнутую копию всей последовательности.
numbers = [1, 2, 3, 4, 5] reversed_numbers = numbers[::-1] print(reversed_numbers) print(numbers)
[5, 4, 3, 2, 1] [1, 2, 3, 4, 5]
§6Выход за границы
Один индекс вне диапазона вызывает IndexError, а срез спокойно ограничивается доступными элементами.
numbers = [1, 2, 3] print(numbers[0:10])
[1, 2, 3]
§7Изменение части списка
Слева от = срез обозначает участок исходного списка. Количество новых элементов может отличаться, поэтому список способен стать длиннее или короче.
numbers = [1, 2, 3, 4, 5] numbers[1:3] = [20, 30, 40] print(numbers)
[1, 20, 30, 40, 4, 5]
part = numbers[1:3] создаёт новую последовательность. numbers[1:3] = values изменяет исходный список.
§8Удаление через срез
del удаляет обозначенный срез из изменяемого списка.
numbers = [1, 2, 3, 4, 5] del numbers[1:4] print(numbers)
[1, 5]
§9Копирование списка
Полный срез items[:] создаёт новый внешний список. То же делают items.copy() и list(items).
numbers = [1, 2, 3] copy_numbers = numbers[:] copy_numbers[0] = 100 print(numbers) print(copy_numbers)
[1, 2, 3] [100, 2, 3]
Если внутри лежат другие изменяемые списки, полный срез не копирует каждый вложенный список отдельно. Глубокое копирование — отдельная тема.
§10Строки и кортежи
Синтаксис одинаков для разных последовательностей. Строка возвращает строку, кортеж — кортеж, список — список.
text = "Python" point = (10, 20, 30, 40) print(text[1:4]) print(point[2:])
yth (30, 40)
§11Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
numbers[1:4] и ожидание четырёх элементов | индекс 4 не входит в результат | читать диапазон как индексы 1, 2, 3 |
numbers[::0] | ValueError: шаг не может быть нулём | использовать положительный или отрицательный ненулевой шаг |
numbers[5:2] при шаге 1 | получится пустой список | для движения назад указать отрицательный шаг |
copy_numbers = numbers | новый список не создаётся; оба имени обозначают один список | copy_numbers = numbers[:] |
text[1:3] = "ab" | TypeError: строку нельзя изменять | создать новую строку из частей |
§12Проверьте себя
Какие индексы выберет items[2:5]?
2, 3 и 4: начало входит, граница 5 — нет.
Меняет ли items[::-1] исходный список?
Нет. Выражение возвращает новую последовательность в обратном порядке.
Чем получение среза отличается от присваивания в срез?
Получение возвращает новую последовательность, а присваивание заменяет часть исходного списка.
§13Шпаргалка
items[start:stop]items[start:stop:step]items[:]items[::-1]Итог главы
Срез выбирает часть последовательности по правилу [start:stop:step]. Начало входит в результат, граница не входит, а шаг управляет направлением и частотой выбора. Получение среза создаёт новую последовательность; присваивание и del со срезом изменяют список.