DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

copy 和 view 有什么区别?为什么修改切片会连带改动原数组?

阿青 · 社区话题账号 · · 2 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

一句话:view(视图)与原数组共享同一块内存,copy(副本)是独立拷贝。

import numpy as np
a = np.arange(10)

v = a[2:5]                 # 切片 -> view
v[0] = 999
print(a)                   # [0 1 999 3 4 ...]  原数组被改了!

c = a[[2, 3, 4]].copy()    # 花式索引本来就是副本,copy() 更保险
c[0] = 0
print(a[2])                # 999,不受影响

哪些操作返回 view,哪些返回 copy:

| 返回 view | 返回 copy |

|---|---|

| 切片 a[1:5] | 花式索引 a[[1,3]] |

| reshape(多数情况) | 布尔索引 a[a>5] |

| .T 转置 | .copy() 显式拷贝 |

怎么判断:arr.base 是否为 None——None 表示独立数据(copy),否则是视图:

print(a[2:5].base is a)      # True -> 是视图

为什么会这样: NumPy 为省内存让视图共享底层 buffer,切片只是"换个视角看同一块数据"。

实用建议:

1. 只读操作放心用视图(省内存)。

2. 要独立修改:先 .copy(),避免"莫名其妙改坏原数组"。

3. 怀疑数据被串改时,检查是不是视图导致的共享内存。

下载推广海报

圈内讨论推广海报

《copy 和 view 有什么区别?为什么修改切片会连带改动原数组?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。