Python列表切片会创建新对象,因其执行浅拷贝:分配新内存存储原列表元素的引用,故修改互不影响;但嵌套可变对象仍共享引用,需deepcopy彻底隔离。

Python 列表切片为什么会创建新对象?  第1张

Python 列表切片会创建新对象,是因为切片操作本质上是**对原列表中元素的浅拷贝(shallow copy)**,它分配一块新的内存来存放这些元素的引用,从而生成一个独立的列表对象。

切片触发对象复制机制

当你执行 new_list = old_list[start:end] 时,Python 解释器会:

  • 计算切片范围,确定要包含哪些索引位置的元素
  • 新建一个空列表对象(即分配新的 list 实例)
  • 将原列表中对应位置的元素引用逐个复制过去(不是复制元素本身,而是引用)

这个过程不共享底层存储,所以修改 new_list 不会影响 old_list,反之亦然。

验证是否为新对象的方法

可以用 id()is 判断两个变量是否指向同一对象:

立即学习“Python免费学习笔记(深入)”;

original = [1, 2, 3]
sliced = original[:]
print(id(original) == id(sliced))  # False
print(original is sliced)           # False

即使内容完全相同,sliced 是全新创建的列表对象。

与直接赋值的区别

直接赋值(如 b = a)只是增加一个名字绑定到同一个对象,而切片强制创建副本:

  • b = aab 指向同一个列表对象
  • b = a[:]b = a[0:len(a)]b 是新列表,独立于 a

这也是为什么常常用 my_list[:] 来快速复制一个列表。

注意:浅拷贝的局限性

切片只复制最外层引用。如果原列表里有可变对象(比如嵌套列表),那么新列表中仍保存着对这些嵌套对象的**相同引用**:

original = [[1, 2], 3]
copied = original[:]
copied[0].append(3)
print(original)  # [[1, 2, 3], 3] ← 原列表也被影响了

此时需要 copy.deepcopy() 才能彻底隔离嵌套结构。