A.2_关于复制和覆盖

A.2 关于复制和覆盖

首先作为预备知识了解一下ndarray实例的“复制”和“覆盖”。先看看下面的代码。

>>> import numpy as np
>>> x = np.array(1)
>>> id(x)
4370746224
>>> x += x # 覆盖
>>> id(x)
4370746224
>>> x = x + x # 复制(新创建)
>>> id(x)
4377585368

id(x)\mathrm{id}(\mathsf{x}) 的结果可以看出, x\mathbf{x} (ndarray实例)要么在内存中被覆盖,要么被重新创建。在使用加法赋值运算符 +=+ = 时, x\mathbf{x} 的对象ID不变,也就是说内存位置相同,所以只有值被改写了。这种不执行复制操作,直接覆盖内存中的值的运算叫作in-place运算。

x=x+xx = x + x 导致对象的ID不同。这说明新的ndarray实例在内存的另一个位置被创建。从内存使用的角度来看,使用in-place运算更好(如果in-place运算没有问题)。

函数id返回Python对象的ID。id函数的返回值取决于实际运行的时间和环境。