Срез это довольно удобная штука для получения определённого диапазона элементов из списка.
Но срезы не так просты как кажется, их можно использовать и для изменения оригинального списка так же как мы это делаем просто по индексу.
Для примера возьмем простой список
ls = [1, 2, 3, 4, 6]
И поехали!
>>> ls[-1] = 5
[1, 2, 3, 4, 5]
Обычное изменение по индексу.
>>> ls[2:4]
[3, 4]
Обычный срез который создаёт новый список на основе старого.
>>> ls[::-1]
[5, 4, 3, 2, 1]
Реверс списка, тоже создаёт новый. Оригинальный список остался без изменений.
Воспользуемся оператором присвоения:
>>> ls[2:4] = [7, 8]
[1, 2, 7, 8, 5]
Заменили диапазон элементов в оригинальном списке.
>>> ls[4:] = [0, 0, 0, 0]
[1, 2, 7, 8, 0, 0, 0, 0]
Указав диапазон сверх имеющегося мы расширили список по аналогии с методом extend(), но при этом еще и немного захватили конец списка. Всё это в одно действие!
>>> ls[:0] = [9, 8, 7]
[9, 8, 7, 1, 2, 7, 8, 0, 0, 0, 0]
Добавили элементы в начало
>>> del ls[-4:]
[9, 8, 7, 1, 2, 7, 8]
Удалили часть элементов списка
>>> ls[1:3] = []
[9, 1, 2, 7, 8]
Еще один способ удалить элементы
>>> ls[:] = []
А этим способом можно пользоваться для очистки списка в Python2, в котором еще не было метода clear().
Кажется мы "потратили" весь наш список)))
Сделаем новый и продолжим.
>>> ls = [1, 2, 3, 4, 5, 6]
>>> ls[::2] = [7,8,9]
[7, 2, 8, 4, 9, 6]
И конечно же мы можем использовать шаг в срезе, но тут требуется соблюдать количество подаваемых элементов. Заменять элементы с каким-то шагом можно, а добавлять нельзя.
s = slice(3, 4)
Как было показано ранее, срез можно сохранять как переменную и использовать в дальнейших манипуляциях
>>> ls[s] = [0]*5
[7, 2, 8, 0, 0, 0, 0, 0, 9, 6]
Заменили один элемент на несколько элементов, расширив исходный список из центра.
И напоследок. Следующие два действия равнозначны и дадут одинаковый результат — полная замена списка.
>>> ls[:] = [1,2,3,4]
>>> ls = [1,2,3,4]
#tricks