Модуль 3 · Списки и циклы

Справочник по Python · модуль 3 · списки и циклы

Глава 3.8

3.8

Срезы в Python

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

Категория
Последовательности
Уровень
Средний
Связанные темы
Списки, строки, индексы
Зачем это знать
Выбирать, заменять и копировать части данных

§1Что такое срез

Срез — выбор части последовательности по записи sequence[start:stop:step]. Обычный срез создаёт новую последовательность и не меняет исходную.

ЧастьСмыслПо умолчанию
startиндекс первого выбранного элементаначало последовательности
stopграница, которая не входит в результатконец последовательности
stepшаг между элементами1

§2Начало входит, граница не входит

В срезе [1:4] элемент с индексом 1 попадёт в результат, а элемент с индексом 4 уже нет.

main.pyиндексы 1, 2 и 3
numbers = [10, 20, 30, 40, 50]
result = numbers[1:4]
print(result)
Выводтри элемента
[20, 30, 40]
Схемаграницы стоят между элементами
numbers[1:4] граница 0 1 2 3 4 5 10 20 30 40 50 индекс 0 1 2 3 4 с конца −5 −4 −3 −2 −1
  • попадает в результат
  • остаётся за границей среза

Схема объясняет правило нагляднее словесной формулировки: числа в квадратных скобках указывают не на элементы, а на границы между ними. Срез забирает всё, что лежит между границей 1 и границей 4, — отсюда и три элемента, и невключение stop. Из той же линейки видно, почему numbers[1:4] и numbers[-4:-1] дают одно и то же.

§3Шаг среза

Третья позиция задаёт расстояние между выбранными элементами. Пропущенные start и stop означают всю последовательность.

main.pyкаждый второй элемент
numbers = [1, 2, 3, 4, 5, 6]
print(numbers[::2])
print(numbers[1::2])
Выводчётные и нечётные позиции
[1, 3, 5]
[2, 4, 6]

§4Отрицательные индексы

Отрицательные индексы отсчитываются с конца: -1 — последний элемент, -2 — предпоследний. Срез [-3:] выбирает последние три элемента.

main.pyхвост списка
numbers = [10, 20, 30, 40, 50]
print(numbers[-3:])
Выводпоследние три
[30, 40, 50]

§5Обратный порядок

Отрицательный шаг идёт справа налево. Запись [::-1] создаёт перевёрнутую копию всей последовательности.

main.pyисходный список сохранён
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, а срез спокойно ограничивается доступными элементами.

main.pystop больше длины
numbers = [1, 2, 3]
print(numbers[0:10])
Выводвсе доступные элементы
[1, 2, 3]

§7Изменение части списка

Слева от = срез обозначает участок исходного списка. Количество новых элементов может отличаться, поэтому список способен стать длиннее или короче.

main.pyзамена двух элементов
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 удаляет обозначенный срез из изменяемого списка.

main.pyудаляем индексы 1–3
numbers = [1, 2, 3, 4, 5]
del numbers[1:4]
print(numbers)
Выводостались края
[1, 5]

§9Копирование списка

Полный срез items[:] создаёт новый внешний список. То же делают items.copy() и list(items).

main.pyнезависимые внешние списки
numbers = [1, 2, 3]
copy_numbers = numbers[:]
copy_numbers[0] = 100
print(numbers)
print(copy_numbers)
Выводоригинал не изменился
[1, 2, 3]
[100, 2, 3]
Поверхностная копия

Если внутри лежат другие изменяемые списки, полный срез не копирует каждый вложенный список отдельно. Глубокое копирование — отдельная тема.

§10Строки и кортежи

Синтаксис одинаков для разных последовательностей. Строка возвращает строку, кортеж — кортеж, список — список.

main.pyтип результата сохраняется
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 со срезом изменяют список.

Глава 3.8 · Срезы · Справочник по PythonАвтор: Макаров Максим Николаевич