You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

numpy数组是否为不可变对象?操作表现引发的疑惑

NumPy数组的可变性与操作逻辑解析

NumPy数组是可变对象,你遇到的不同操作表现差异,本质是操作是否直接修改数组的内存数据,而非对象本身的可变性问题。

1. 不同操作的本质区别

  • Arr + 10:这是NumPy对+运算符的重载实现,会创建并返回一个新数组,计算结果存储在新数组的内存空间里,原数组的内存数据不会被改动,所以原数组保持不变。
    示例代码:

    import numpy as np
    Arr = np.array([1,2,3,4,5])
    new_Arr = Arr + 10
    print(Arr)        # 输出 [1 2 3 4 5]
    print(new_Arr)    # 输出 [11 12 13 14 15]
    
  • Arr += 100 和 Arr[0] = 100:这类属于原地修改操作。+=是原地加法运算符,会直接在原数组占用的内存空间上修改元素值;索引赋值则是直接定位到数组的对应内存位置修改数据,因此原数组会被直接改变。
    示例代码:

    Arr += 100
    print(Arr)        # 输出 [101 102 103 104 105]
    Arr[0] = 100
    print(Arr)        # 输出 [100 102 103 104 105]
    

2. 与浅拷贝/深拷贝的关联

你遇到的操作差异和拷贝机制没有直接关系,但如果涉及数组的复制操作,才需要区分浅拷贝(视图)和深拷贝:

  • 视图(浅拷贝):比如通过切片Arr_slice = Arr[1:3]得到的是原数组的视图,二者共享同一块内存数据,修改视图会同步影响原数组。
  • 深拷贝:使用Arr_copy = Arr.copy()会创建完全独立的新数组,修改拷贝后的数组不会对原数组产生任何影响。

总结来说,NumPy数组本身是可变的,不同操作的表现差异,是因为运算符或操作的实现逻辑不同——有的返回新数组,有的直接修改原数组的内存数据。

内容的提问来源于stack exchange,提问作者variable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:15:31