Как работают срезы в Python?
- Что делает запись a[1:5:2]?
- Как развернуть список срезом?
seq[start:stop:step] — новая последовательность с start включительно до stop не включая.
- Отрицательные индексы считаются с конца:
a[-1]— последний a[::-1]— в обратном порядке,a[:]— поверхностная копия
А ещё Срез не бросает IndexError при выходе за границы
Подробно
Срез работает у списков, кортежей, строк, bytes и range. Все три части необязательны: start по умолчанию — начало, stop — конец, step — 1. При отрицательном шаге значения по умолчанию меняются местами, поэтому a[::-1] разворачивает последовательность.
Свойства, о которых спрашивают:
- Срез создаёт новый объект. Для списка
a[:]— поверхностная копия: сам список новый, вложенные объекты общие. - Выход за границы не ошибка.
a[100:200]вернёт пустой список, тогда какa[100]броситIndexError. - Присваивание срезу меняет список на месте и может менять его длину:
a[1:3] = [9, 9, 9]. С шагом длины должны совпадать. - Удаление срезом:
del a[::2]убирает каждый второй элемент. - Сложность — O(k), где k — длина результата.
Срез — объект slice(start, stop, step); свои классы поддерживают срезы через __getitem__, получая этот объект.
Пример
a = [0, 1, 2, 3, 4, 5]
a[1:4] # [1, 2, 3]
a[-2:] # [4, 5]
a[::2] # [0, 2, 4]
a[::-1] # [5, 4, 3, 2, 1, 0]
a[10:] # [] — без ошибки
a[1:3] = ["x", "y", "z"] # [0, 'x', 'y', 'z', 3, 4, 5]
"python"[::-1] # 'nohtyp'Что хотят услышать
- Полуинтервал: start включается, stop — нет.
- Отрицательные индексы и отрицательный шаг.
- Срез — новый объект,
a[:]— поверхностная копия. - Отсутствие IndexError при выходе за границы.
Частые ошибки
- Считать, что
stopвходит в результат. - Думать, что
a[:]копирует вложенные списки.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗seq[start:stop:step]: start и stop включаются, а выход за границы бросает IndexError
- ✗a[:] возвращает тот же объект, а не копию, поэтому изменения видны в оригинале
- ✓start включается, stop — нет; срез не бросает IndexError
- ✗Шаг среза не может быть отрицательным: развернуть список срезом нельзя
Что спросят дальше
Разбор темы
- Итераторы, генераторы и itertools
Протокол итерации, генераторы и генераторные выражения, срезы, send и yield from, ленивые инструменты itertools.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.