Python 为什么扩展切片分配不如常规切片分配灵活?

Python 为什么扩展切片分配不如常规切片分配灵活?,python,python-3.x,list,variable-assignment,slice,Python,Python 3.x,List,Variable Assignment,Slice,根据以下方面的Python文档: 如果您有一个可变序列,如列表或数组,您可以 分配或删除扩展切片,但存在一些差异 在分配到扩展切片和常规切片之间。分配给 常规切片可用于更改序列的长度: >>> a = range(3) >>> a [0, 1, 2] >>> a[1:3] = [4, 5, 6] >>> a [0, 4, 5, 6] 扩展切片没有这么灵活。当分配给扩展 语句右侧的列表必须包含 与要替换的切片数量相同的项目:

根据以下方面的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
>a=范围(4)
>>>a
[0, 1, 2, 3]
>>>a[::2]
[0, 2]
>>>a[::2]=[0,-1]
>>>a
[0, 1, -1, 3]
>>>a[::2]=[0,1,2]
回溯(最近一次呼叫最后一次):
文件“”,第1行,是否在中?
ValueError:尝试将大小为3的序列分配给大小为2的扩展片

我不明白为什么“普通”切片方法有效,但“扩展”切片方法无效。“普通”切片与“扩展”切片的区别是什么?为什么“扩展”切片方法会失败?

如果您试着想象一下问题是如何发生的,那么就更容易看出问题所在

a[::3] = [0, 1, 2]
将使用4项列表:

+---+---+---+---+   +   +---+
| a | b | c | d |       | ? |
+---+---+---+---+   +   +---+
  ^           ^           ^
+---+       +---+       +---+
| 0 |       | 1 |       | 2 |
+---+       +---+       +---+
我们试图替换每三个值,但是我们的列表不够长,所以如果我们继续,我们最终会得到某种奇怪的弗兰肯斯坦列表,其中一些项目实际上并不存在。如果有人试图访问
a[5]
并得到一个
索引器(即使
a[6]
正常工作),他们会非常困惑

虽然从技术上讲,可以通过将
a[::2]
扩展一个来避免
a[::2]
的情况,但是为了一致性,Python禁止所有扩展的切片分配,除非已经有了值的位置


常规切片的步幅始终为1,因此不可能出现任何间隙,因此可以安全地允许分配任务。

如果您尝试想象一下如何分配,则更容易看到问题

a[::3] = [0, 1, 2]
将使用4项列表:

+---+---+---+---+   +   +---+
| a | b | c | d |       | ? |
+---+---+---+---+   +   +---+
  ^           ^           ^
+---+       +---+       +---+
| 0 |       | 1 |       | 2 |
+---+       +---+       +---+
我们试图替换每三个值,但是我们的列表不够长,所以如果我们继续,我们最终会得到某种奇怪的弗兰肯斯坦列表,其中一些项目实际上并不存在。如果有人试图访问
a[5]
并得到一个
索引器(即使
a[6]
正常工作),他们会非常困惑

虽然从技术上讲,可以通过将
a[::2]
扩展一个来避免
a[::2]
的情况,但是为了一致性,Python禁止所有扩展的切片分配,除非已经有了值的位置


常规切片的步长始终为1,因此不可能出现任何间隙,因此可以安全地允许赋值。

区分它的是第三个参数,即步长,如开头段落所述。它失败是因为语句右侧的列表中包含的项目数(3)与它要替换的切片(2)的项目数(3)不相同,这是您复制的文本所要求的。这就是为什么他们用它作为描述的例证。不清楚“为什么”是什么意思。区别它的是第三个参数,即步骤,如开头一段所述。它失败是因为语句右侧的列表中包含的项目数(3)与它要替换的切片(2)的项目数(3)不相同,这是您复制的文本所要求的。这就是为什么他们用它作为描述的例证。不清楚你所说的“为什么”是什么意思。