Обычный срез всегда имеет шаг один, поэтому нет никаких шансов на возникновение пробелов, и поэтому назначение может быть безопасно разрешено.

сно документации Python порасширенные ломтики:

Если у вас есть изменяемая последовательность, такая как список или массив, вы можете назначить или удалить расширенный фрагмент, но есть некоторые различия между назначением расширенного и обычного фрагментов. Присвоение регулярному срезу можно использовать для изменения длины последовательности:

>>> a = range(3)
>>> a
[0, 1, 2]
>>> a[1:3] = [4, 5, 6]
>>> a
[0, 4, 5, 6]

Расширенные ломтики не такие гибкие. При назначении расширенному слайсу список в правой части инструкции должен содержать то же количество элементов, что и заменяемый слайс:

>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> a[::2] = [0, -1]
>>> a
[0, 1, -1, 3]
>>> a[::2] = [0,1,2]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: attempt to assign sequence of size 3 to extended slice of size 2

Я не понимаю, почему «обычный» метод слайса работает, но «расширенный» метод слайса не работает. Что отличает «обычный» срез от «расширенного» среза и почему «расширенный» метод среза дает сбой?

 jonrsharpe25 дек. 2017 г., 12:55
Его отличает третий параметр - шаг, как описано во вступительном абзаце. Это терпит неудачу, потому что список в правой части инструкции не содержит того же количества элементов (3), что и заменяемый фрагмент (2), что и требуется для того текста, который вы скопировали. Вот почему они используют его в качестве иллюстрации для этого описания. Непонятно, что вы подразумеваете под"Почему".

Ответы на вопрос(1)

Решение Вопроса

Немного легче увидеть проблему, если попытаться представить, как

a[::3] = [0, 1, 2]

будет работать со списком из 4 пунктов:

+---+---+---+---+   +   +---+
| a | b | c | d |       | ? |
+---+---+---+---+   +   +---+
  ^           ^           ^
+---+       +---+       +---+
| 0 |       | 1 |       | 2 |
+---+       +---+       +---+

Мы пытаемся заменить каждое третье значение, но наш список недостаточно длинный, поэтому, если мы все равно продолжим, у нас получится какой-то странный список Франкенштейна, в котором некоторые элементы на самом деле не существуют. Если кто-то пытался получить доступa[5] и получилIndexError (даже не смотря наa[6] работает нормально), они бы получилидействительно смущенный.

Хотя вы могли бы технически сойти с рукa[::2] случай путем расширенияa с одной стороны, для согласованности Python запрещает все расширенные назначения срезов, если только для этого значения нет места.

Обычный срез всегда имеет шаг один, поэтому нет никаких шансов на возникновение пробелов, и поэтому назначение может быть безопасно разрешено.

Ваш ответ на вопрос