np.copy() 是数据缓冲区级深拷贝,修改不影响原数组;但对 object 类型数组仅复制引用,非递归深拷贝,需用 copy.deepcopy() 隔离嵌套对象。

np.copy() 是深度拷贝 —— 但仅限于数组的**数据缓冲区(data buffer)层面**,不递归处理元素内部的对象引用。它不是 Python 标准库中 copy.deepcopy() 那种全递归深拷贝。
为什么 np.copy() 修改后不影响原数组?
因为 np.copy() 在内存中分配了全新的数据缓冲区,并把原始数组的全部字节逐位复制过去。这意味着:
- 新数组和原数组的
.data指向不同内存地址(id(arr.data)不同) - 修改新数组的数值(如
copy_arr[0] = 999)只改写自己的缓冲区,原数组缓冲区不受影响 - 这满足“数据隔离”的核心需求,所以被 NumPy 文档定义为“deep copy”
np.copy() 对 object 类型数组只是浅拷贝
当数组的 dtype=object 时,np.copy() 只复制对象的**引用地址**,不复制引用所指的对象本身:
- 假设
arr = np.array([{'a': 1}], dtype=object) -
copy_arr = np.copy(arr)后,copy_arr[0] is arr[0]返回True - 修改
copy_arr[0]['a'] = 2,原数组arr[0]['a']也会变成 2 - 此时必须用
import copy; copy.deepcopy(arr)才能真正隔离
np.copy() 和 arr.copy()、np.array(arr, copy=True) 的区别
三者在行为上完全等价,都是创建数据缓冲区级的深拷贝:
-
np.copy(arr):函数式调用,最显式,推荐用于强调“我要深拷贝” -
arr.copy():方法调用,等价,但容易和 Pandas 的.copy()(默认 shallow)混淆 -
np.array(arr, copy=True):构造式写法,copy=False时可能返回视图,务必显式写copy=True - 性能上无实质差异;但
np.copy()更明确,且不依赖arr是否有.copy()方法(比如某些子类)
真正容易被忽略的是 object 数组场景 —— 看似用了 np.copy(),却还在共享嵌套字典/列表,导致静默副作用。这种“伪深拷贝”陷阱,在调试时往往要靠 is 判断或 id() 对比才能暴露。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











