2012-06-09 17 views
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的扩展片?

我可以分配到一个扩展片,其步长为1,即使我分配迭代是“错误的长度”。那么为什么我不能将其分配给步长为-1的扩展片并使其以明显的方式工作?

回答

3

我认为创建一个步长为1的扩展片有效地像一个常规片而不是一个扩展片。

扩展切片不允许你改变序列的长度,如上所述here

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

至于为什么它是这样工作的,我只能猜测那是因为那里是没有明显的行为的案件。以此示例为例:

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

您认为该如何工作?我想你可以用10 & 11代替1,但是7呢?你离开它吗?删除它?删除过去7的整个剩余序列?也许这只是我,但这种情况似乎并不太清楚。我会假设这是为什么这种行为不允许扩展切片。

+2

有道理。尽管如此,OP是正确的,对于-1的步骤,预期的行为是非常清楚的,所以它可能是很好的,有一个特殊的步骤是1 ... – weronika

+0

@weronika同意,但告诉蟒蛇开发者;) – obmarg

相关问题