为什么我不能将任意迭代分配给步长为-1的扩展切片?

时间:2012-06-09 18:40:31

标签: python slice assignment-operator

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的扩展切片,即使我正在分配的可迭代是“错误的长度”。那么为什么我不能分配一个步长为-1的扩展切片并让它以明显的方式工作?

1 个答案:

答案 0 :(得分:3)

我认为创建一个步长为1的扩展切片实际上就像一个常规切片而不是一个扩展切片。

扩展切片不允许您更改序列的长度,如here

所述
  

如果您有可变序列(如列表或数组),则可以指定或删除扩展切片,但在扩展切片和常规切片之间存在一些差异。可以使用对常规切片的分配来改变序列的长度。   扩展切片不灵活。分配给扩展切片时,语句右侧的列表必须包含与要替换的切片相同数量的项目。

至于为什么它以这种方式工作,我只能猜测是因为没有明显行为的情况。举个例子:

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

您希望如何运作?我想你可以替换1&amp; 4与10&amp; 11,但7呢?你离开了吗?删除它?删除7过去的整个序列的其余部分?也许这只是我,但这种情况似乎并不太明确。我将假设为什么这种行为不允许扩展切片。