为什么ndarray的相关方法表现出类似不可变对象的特性?
问题核心原因解答
- 首先纠正常见认知误区:NumPy的ndarray本身属于可变类型,支持原地修改元素值(例如执行
x[0] = 99会直接改动原数组),你观察到的reshape不修改原数组的现象,和不可变/可变的类型属性没有直接关联,差异本质来自两类对象的方法设计策略不同。 - NumPy的
ndarray.reshape()方法默认不执行原地修改,调用后会返回一个新的数组视图(内存布局兼容时)或者新的数组副本,完全不会改动原数组的结构。如果需要原地修改数组形状,可直接修改数组的shape属性:x.shape = (3,2),执行后原数组就会变成二维结构。 - Python内置列表的同类修改方法(例如
sort()、reverse())默认采用原地修改逻辑,调用后不会返回新对象,直接修改原列表的内容或顺序。当然列表也有非原地的等价操作,例如内置函数sorted(列表)就会返回全新的排序后列表,原列表不会被改动。
直观代码对比参考:
# ndarray reshape 行为示例 import numpy as np x = np.arange(6) y = x.reshape(3,2) # 必须接收返回值才能拿到重塑后的结构 print(x) # 输出 [0 1 2 3 4 5],原数组无变化 print(y) # 输出 [[0 1] [2 3] [4 5]],为重塑后的结果 # 列表原地修改方法示例 a = [3,1,2] a.sort() print(a) # 输出 [1,2,3],原列表被直接修改
内容的提问来源于stack exchange,提问作者Moshe
相关产品推荐
相关产品推荐

