Почему a[::-1] работает, а a[::] = a[::-1] — нет?
Есть список a = [1, 2, 3, 4]. Делаю a[::-1] — получаю перевёрнутый. Ок. Потом пытаюсь заменить содержимое через срез: a[::] = a[::-1] — всё работает. Но если попробовать a[1:-1] = a[::-1] — получаю полную кашу. Почему длина среза справа и слева не обязана совпадать?
1 ответ
тут всё зависит от того, обычный срез или «расширенный» (со step).
a[1:-1] и a[::] — обычные срезы, шаг 1. присваивание в такой срез работает как вставка-замена куска: питон вырезает участок и вставляет на его место правую часть, а сколько там элементов — неважно. поэтому длины могут не совпадать, список просто растянется или сожмётся.
вот что реально происходит у тебя:
a = [1, 2, 3, 4]
a[1:-1] = a[::-1] # вырезали [2, 3], вставили [4, 3, 2, 1]
print(a) # [1, 4, 3, 2, 1, 4]
никакой каши — просто на место двух элементов встали четыре)
а с шагом не 1 (расширенный срез, типа a[::2]) правило другое: там длины ОБЯЗАНЫ совпадать, иначе ValueError:
a = [1, 2, 3, 4]
a[::2] = [9, 9] # ок, оба по 2
a[::2] = [9, 9, 9] # ValueError: attempt to assign sequence of size 3 to extended slice of size 2
короче: шаг 1 — вставка любой длины, шаг не 1 — строго один в один