Вопрос с собеседования · Python

Как работают срезы в Python?

JuniorКоллекции
Ещё спрашивают так:
  • Что делает запись 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
  • ✗Шаг среза не может быть отрицательным: развернуть список срезом нельзя

Что спросят дальше

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

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

Разбор собеседования