为何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
相关产品推荐
相关产品推荐

