此问题已在此处有答案:
Are numpy arrays passed by reference?(3个答案)
22天前关闭
在创建数组x
并引用y
之后,在单个索引处修改x
(或y
)将导致x
和y
同时发生变化,而不是复制z
。
示例:
创建一个数组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
当重复上面的示例时,但是现在通过执行例如对y
进行向量-标量乘法复制而不引用。这似乎令人困惑。在这种情况下,为什么要复制而不是引用,有没有具体的原因?
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
1条答案
按热度按时间jljoyd4f1#
x = x * 2
来修改数组x
时,会在memory
中创建一个new array
来存储乘法结果。这个新数组被分配给变量x
,而变量y
仍然引用原始数组,并且不反映对x所做的更改。modify x or y
,两个变量仍然引用内存中的same array
。这是因为修改单个索引不会创建new array
,它只是修改了现有的数组。因此,x和y都反映了changes
。copy
还是reference
取决于执行的特定操作,修改数组中的单个索引会修改原始数组,而执行创建新数组(如vector-scalar multiplication
)的操作会导致创建新数组并将其分配给变量