示例:
创建一个数组 x,带有引用 y 和副本 z:
x = np.array([1, 2, 3])
y = x
z = np.copy(x)
修改索引0处的数组
x[0] =0
x
Out: array([0, 2, 3])
y
Out: array([0, 2, 3])
z
Out: array([1, 2, 3])
在这种情况下x和y共享相同的内存位置
id(x)
Out: 2519145124656
id(y)
Out: 2519145124656
id(z)
Out: 2519145126192
x = np.array([1, 2, 3])
y = x
z = np.copy(x)
通过与标量 2 相乘来修改 x
x = x * 2
x
Out: array([2, 4, 6])
y
Out: array([1, 2, 3])
z
Out: array([1, 2, 3])
x 和 y 不再共享相同的内存位置,尽管之前没有进行显式复制
id(x)
Out: 2519145069712
id(y)
Out: 2519145224592
id(z)
Out: 2519145196400
x
来修改数组 x = x * 2
时,会在 new array
中创建一个 memory
来存储乘法结果。这个新数组被分配给变量x
,而变量y
仍然引用原始数组,并且不反映对x所做的更改。modify x or y
时,两个变量仍然引用内存中的 same array
。这是因为修改单个索引不会创建 new array
,它只是修改现有数组。因此,x 和 y 都反映了所做的 changes
。copy
或 reference
取决于所执行的具体操作,修改数组中的单个索引会在执行创建新数组的操作时就地修改原始数组(例如 vector-scalar multiplication
)导致创建一个新数组并将其分配给变量