
Python中对嵌套列表直接使用copy()或=赋值,不会真正复制内部子列表,修改副本会影响原列表——这是浅拷贝的典型表现。
浅拷贝只复制外层,内层仍共享引用
当你执行new_list = old_list.copy()或new_list = old_list[:],Python仅复制最外层列表对象,其中每个元素(比如子列表)仍是原对象的引用。这意味着:
- 修改
new_list本身(如追加元素、删掉某项)不影响old_list - 但修改
new_list[0][1]这种嵌套项,old_list[0][1]也会跟着变 - 常见于二维列表、含列表的字典、JSON-like结构等场景
深拷贝才能彻底隔离嵌套结构
用copy.deepcopy()可递归复制所有层级的对象,确保内外层完全独立:
import copy original = [[1, 2], [3, 4]] shallow = original.copy() deep = copy.deepcopy(original) <p>shallow[0].append(99) # original[0] 也变成 [1, 2, 99] deep[0].append(88) # original 不受影响
避免深拷贝的轻量替代方案
如果只是临时避免副作用,且结构较固定,可考虑更可控的方式:
立即学习“Python免费学习笔记(深入)”;
- 用列表推导式重建外层+内层:
new = [sublist[:] for sublist in original] - 对已知深度的二维列表,手动切片复制每行:
new = [row.copy() for row in original] - 函数内需要隔离输入时,优先在开头做一次
deepcopy,而非依赖调用方传入“安全副本”
警惕隐式浅拷贝场景
有些操作看似新建了对象,实则仍是浅拷贝:
-
json.loads(json.dumps(obj))能实现类似深拷贝效果,但仅限JSON支持类型(不支持函数、自定义类等) - pandas DataFrame 的
.copy()默认是浅拷贝;需显式写.copy(deep=True) - NumPy数组的
.copy()是深拷贝,但arr.view()或切片arr[...]通常共享内存









