为什么切片[:0]不会报错?
为什么切片 [:0] 不会报错呢?
- 练习:把 x 列表改成在开头加上 y 列表,然后再加上 x 列表。不要使用 "+" 操作符,也不要用任何方法或函数。
工作人员的回答:
y = [1, 2, 3]
x = [4, 5, 6]
x[:0] = y
print(x)
结果:[1, 2, 3, 4, 5, 6]
问题是,为什么 x[:0] 不会出错?在 x[0] 之前有什么空间呢?
索引 | ||
---|---|---|
0 或 -1 | 1 | 2 等等... |
我的意思是,它放在哪里呢?!在第一个索引之前有空间吗?!
2 个回答
1
切片赋值并不是在“插入”,而是“替换”。你可以把任何赋值想象成
L[x:y] = z
其中 0 <= x <= y
可以理解为
L = L[:x] + z + L[y:]
只不过这次是直接在原来的列表上修改,而不是创建一个新的列表。具体来说,
- 如果
z
比目标切片短,那么列表会变短 - 如果
z
比目标切片长,那么列表会变长
当你对 x[:0]
进行赋值时,你是在用 y
的内容替换列表开头的空切片,而不会影响到 x[0:]
中的元素(也就是整个原始列表)。根据上面的解释,你可以说 x[:0] = y
相当于 x[:0] + y + x[0:]
,也就是 y + x
,但这次是直接在原来的地方修改。
* 这里的解释可以扩展到任意的 x
和 y
,但对于这个回答来说似乎没有必要。
1
x[:0]
和 x[0:0]
是一样的,都是从索引 0
开始到(不包括) 0
的切片。这实际上表示的是一个列表的片段,但这个片段里没有任何元素,所以结果是一个空的切片。因此,当你把一个列表 y
赋值给这个切片,比如 x[:0] = y
或者 x[0:0] = y
,你并不是在替换 x
中的任何元素,因为这个切片是空的。
相反,你是在列表的开头插入了 y
中的所有元素。