Python Numpy数组别名行为不一致

Python Numpy数组别名行为不一致,python,numpy,Python,Numpy,以下行为是预期的,也是我得到的。这与本机Python对象(如列表)的别名工作方式一致 >>> x = np.array([1, 2, 3]) >>> y = x >>> x array([1, 2, 3]) >>> y array([1, 2, 3]) >>> x = x + np.array([2, 3, 4]) >>> x array([3, 5, 7]) >>> y

以下行为是预期的,也是我得到的。这与本机Python对象(如列表)的别名工作方式一致

>>> x = np.array([1, 2, 3])
>>> y = x
>>> x
array([1, 2, 3])
>>> y
array([1, 2, 3])
>>> x = x + np.array([2, 3, 4])
>>> x
array([3, 5, 7])
>>> y
array([1, 2, 3])
但是将
x=x+np.array([2,3,4])
更改为
x+=np.array([2,3,4])


在我的机器上,Numpy版本是1.16.4。这是一个bug还是一个特性?如果这是一个特性,那么
x=x+np.array([2,3,4])
x+=np.array([2,3,4])有何不同
您的行
y=x
不会创建数组的副本;它只是告诉
y
指向与
x
相同的数据,如果查看它们的
id
s,您可以看到:

x = np.array([1,2,3])
y = x
print(id(x), id(y))

(140644627505280, 140644627505280)
x=x+np.array([2,3,4])
将把x重新分配给新的
id
,而
x+=np.array([2,3,4])
将对其进行适当修改。因此,
+=
也会修改y,而
x=x+…
不会修改

x += np.array([2, 3, 4])
print(id(x))
print(x, y)

x = x + np.array([2, 3, 4])
print(id(x))
print(x, y)

140644627505280
[3 5 7] [3 5 7]
140644627175744
[ 5  8 11] [3 5 7]

这方面的主要收获是:每当你对“别名”感到困惑时(正如OP所说的那样),可以大量使用
print(id(x))
来查看发生了什么,这通常会把事情弄清楚。
x += np.array([2, 3, 4])
print(id(x))
print(x, y)

x = x + np.array([2, 3, 4])
print(id(x))
print(x, y)

140644627505280
[3 5 7] [3 5 7]
140644627175744
[ 5  8 11] [3 5 7]