← Все вопросы

Почему a[::-1] работает, а a[::] = a[::-1] — нет?

Задан 2 месяца назад7 просмотров1 ответ
0

Есть список a = [1, 2, 3, 4]. Делаю a[::-1] — получаю перевёрнутый. Ок. Потом пытаюсь заменить содержимое через срез: a[::] = a[::-1] — всё работает. Но если попробовать a[1:-1] = a[::-1] — получаю полную кашу. Почему длина среза справа и слева не обязана совпадать?

1 ответ

0

тут всё зависит от того, обычный срез или «расширенный» (со 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 — строго один в один

Ваш ответ

, чтобы ответить на вопрос.