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

为何NumPy减法赋值运算符会修改引用对象?

NumPy中-=赋值运算符与显式减法的行为差异解析

先看你给出的示例代码:

import numpy as np
np1 = np.array([1])
np2 = np1
np2 -= 2
print(np1)

np3 = np.array([1])
np4 = np3
np4 = np4 - 2
print(np3)

输出结果:

[-1]
[1]

造成这种差异的核心原因是原地操作与新对象创建的区别:

  • 当执行np2 = np1时,np2和np1指向的是同一个NumPy数组对象(NumPy数组属于可变对象),并没有生成原数组的副本。
  • -=是原地赋值运算符,它会直接在当前数组的内存空间上修改数据,不会创建新的数组对象。所以np2的修改会直接作用在它和np1共同指向的数组上,因此np1的输出也会变为[-1]。
  • 而np4 = np4 - 2这类显式减法运算,NumPy会生成一个全新的数组对象来存储运算结果,随后将np4的引用指向这个新对象。原有的np3仍然指向最初创建的数组,所以np3的输出保持[1]不变。

你可以通过id()函数验证内存地址的变化,更直观地理解这个过程:

import numpy as np
np1 = np.array([1])
np2 = np1
print(id(np1), id(np2))  # 输出相同内存地址,说明指向同一对象
np2 -= 2
print(id(np1), id(np2))  # 地址不变,证明是原地修改

np3 = np.array([1])
np4 = np3
print(id(np3), id(np4))  # 初始地址相同
np4 = np4 - 2
print(id(np3), id(np4))  # 地址不同,np4已指向新对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:33:24