1、copy 和 view 的核心区别
一句话总结
copy 是“数据拷贝”,view 是“数据共享”
| 对比项 | copy | view |
|---|---|---|
| 是否创建新数据 | ✅ 是 | ❌ 否 |
| 是否拥有数据 | ✅ 是 | ❌ 否 |
| 修改是否影响原数组 | ❌ 不影响 | ✅ 会影响 |
| 内存占用 | 较大 | 很小 |
| 常见来源 | copy()、高级索引 | 切片、view() |
行为差异说明
copy
拥有独立的数据块
与原数组互不影响
安全但占用更多内存
view
与原数组共享同一份数据
任意一方修改都会影响另一方
高效但容易产生“隐式修改”
2、copy(数组拷贝)
示例:创建副本并修改原数组
import numpy as np arr = np.array([1, 2, 3, 4, 5]) x = arr.copy() arr[0] = 42print(arr) print(x)
输出:
[42 2 3 4 5] [ 1 2 3 4 5]
说明:
x是arr的 独立副本修改
arr不会影响x
3、view(数组视图)
示例 1:修改原数组,view 同步变化
import numpy as np arr = np.array([1, 2, 3, 4, 5]) x = arr.view() arr[0] = 42print(arr) print(x)
输出:
[42 2 3 4 5] [42 2 3 4 5]
示例 2:修改 view,原数组同步变化
import numpy as np arr = np.array([1, 2, 3, 4, 5]) x = arr.view() x[0] = 31print(arr) print(x)
输出:
[31 2 3 4 5] [31 2 3 4 5]
说明:
arr与x共享同一块内存修改任意一个都会影响另一个
4、如何判断数组是否“拥有数据”(base 属性)
NumPy 中的每个数组都有一个 base 属性:
base is None
👉 该数组 拥有自己的数据base is not None
👉 该数组 是某个数组的 view
示例:使用 base 判断 copy 和 view
import numpy as np arr = np.array([1, 2, 3, 4, 5]) x = arr.copy() y = arr.view() print(x.base) print(y.base)
输出:
None [1 2 3 4 5]
说明:
x.base is None→ copy,拥有数据y.base指向原数组 → view
5、初学者高频踩坑
❗ 切片默认返回的是 view,而不是 copy
arr = np.array([1, 2, 3, 4, 5]) s = arr[1:4] # 切片 s[0] = 99print(arr)
输出:
[1 99 3 4 5]
📌 这是因为 切片产生的是 view
如希望切片后得到独立数组,必须显式 copy:
s = arr[1:4].copy()