Вопрос по slice, python, assignment-operator – Почему я не могу назначить произвольную итерацию расширенному слайсу с шагом -1?

6
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> u = [4, 5, 6, 7, 8, 9]
>>> u[1::1] = [3, 2, 1, 0]
>>> u
[4, 3, 2, 1, 0]
>>> u[9:0:-1] = [8, 7, 6, 5]
>>> u
[4, 5, 6, 7, 8]
>>> u[9:0:-1] = [16, 12, 8]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 3 to extended slice of size 4
>>> u
[4, 5, 6, 7, 8]
>>>

Ожидаемое поведение: нет исключений в окончательном утверждении присваивания;u должен печатать на последней строке как[4, 8, 12, 16].

Я могу назначить расширенному срезу, шаг которого равен 1, даже если повторяемое назначение I является «неправильной длиной». Почему тогда я не могу назначить расширенный срез, шаг которого равен -1, и заставить его работать очевидным образом?

Ваш Ответ

1   ответ
3

что создание расширенного среза с шагом 1 эффективно действует как обычный срез, а не как расширенный срез.

Расширенные срезы не позволяют изменять длину последовательности, как отмеченоВот

If you have a mutable sequence such as a list or an array you can assign to or delete an extended slice, but there are some differences between assignment to extended and regular slices. Assignment to a regular slice can be used to change the length of the sequence. Extended slices aren't this flexible. When assigning to an extended slice, the list on the right hand side of the statement must contain the same number of items as the slice it is replacing.

Что касается того, почему это работает таким образом, я могу только догадываться, что это из-за случаев, когда нет очевидного поведения. Возьмите этот пример:

u = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
u[0:8:3] = [ 10, 11 ]

Как вы ожидаете, что это сработает? , вы могли бы просто заменить 1 & amp; 4 с 10 & amp; 11, а как же 7? Ты оставляешь это? Удали это? Удалить всю оставшуюся часть последовательности после 7? Может быть, это только я, но этот случай не кажется слишком ясным. Я хотел бы предположить, почему такого рода поведение просто не допускается для расширенных срезов.

@weronika Согласен, но расскажите об этом разработчикам Python;)
Имеет смысл. Тем не менее, ОП прав, что для шага -1 ожидаемое поведение довольно ясно, поэтому было бы неплохо иметь такой специальный случай, как шаг 1 ...

Похожие вопросы