Объяснение к уроку
После этого урока ты сможешь:
start:stop, помня, что stop не включается.[:] или .copy() перед изменением его элементов.Срез (slice) выбирает несколько элементов без необходимости вручную обращаться к каждому по индексу. В items[start:stop] элемент start включается, а stop — нет. Например, items[1:4] возвращает элементы с индексами 1, 2 и 3.
В срезе можно опустить любую из границ: items[:3] берет первые три элемента, а items[2:] берет все элементы начиная с индекса 2. Отрицательные границы отсчитываются с конца, как ты практиковал в предыдущем уроке. items[::2] берет каждый второй элемент, используя положительный шаг (step). В отличие от обычной индексации, срез, конец которого выходит за пределы длины списка, просто останавливается на доступных элементах.
Копирование имеет решающее значение, когда данные изменяемы. candidate = baseline не создает новый список; оба имени ссылаются на один и тот же объект. Напротив, candidate = baseline[:] или candidate = baseline.copy() создает новый внешний список. Обновление элемента верхнего уровня в копии не повлияет на оригинал.
Это поверхностные копии (shallow copies): если список содержит вложенные изменяемые объекты, эти вложенные объекты остаются общими. Более сложные вложенные структуры мы рассмотрим в следующих уроках.
Конечная позиция не включается.
stages = ["fetch", "build", "test", "package", "deploy"]
print(stages[1:4])Вывод:
['build', 'test', 'package']Элемент с индексом 4 не включается.
Пропуск начала или конца позволяет легко выбирать элементы с любого конца.
regions = ["eu", "us", "apac", "sa", "ca"]
print(regions[:2])
print(regions[-2:])Вывод:
['eu', 'us']
['sa', 'ca']Отрицательное начало выбирает два последних элемента.
Третье значение среза определяет шаг перемещения между выбранными элементами.
readings = [8, 9, 10, 11, 12, 13]
print(readings[::2])Вывод:
[8, 10, 12]Выборка начинается с первого элемента и продвигается с шагом два.
Копия через срез создает новый список, который можно изменять независимо.
baseline = ["queued", "running", "done"]
preview = baseline[:]
preview[1] = "paused"
print(baseline)
print(preview)Вывод:
['queued', 'running', 'done']
['queued', 'paused', 'done']baseline не меняется. Вызов baseline.copy() — еще один способ создать такую копию.
| Потребность | Синтаксис |
|---|---|
Взять с начала до stop - 1 | items[:stop] |
Взять от start до конца | items[start:] |
| Взять средний диапазон | items[start:stop] |
| Взять каждый второй элемент | items[::2] |
| Скопировать внешний список | items[:] или items.copy() |
| Создать другое имя для того же списка | alias = items |
IndexError: срез безопасно возвращает доступную часть.candidate = baseline для копирования: оба имени будут указывать на один и тот же список.[:] и .copy() копируют только внешний список.