为什么切片[:0]不会报错?

-2 投票
2 回答
64 浏览
提问于 2025-04-14 17:12

为什么切片 [: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,但这次是直接在原来的地方修改。


* 这里的解释可以扩展到任意的 xy,但对于这个回答来说似乎没有必要。

1

x[:0]x[0:0] 是一样的,都是从索引 0 开始到(不包括) 0 的切片。这实际上表示的是一个列表的片段,但这个片段里没有任何元素,所以结果是一个空的切片。因此,当你把一个列表 y 赋值给这个切片,比如 x[:0] = y 或者 x[0:0] = y,你并不是在替换 x 中的任何元素,因为这个切片是空的。

相反,你是在列表的开头插入了 y 中的所有元素。

撰写回答