这其实根本不是问题;它是数组(和其他对象)在Python中工作的方式。
想像这样:您在代码示例中创建的数组是位于内存中某个位置的对象。但是你不能在程序中使用它来告诉Python在内存中去寻找它;你必须给它一个名字。当你写的时候
a = np.array([[1,2],[3,4]])
您正在创建数组并创建引用它的名称a。从那时起,Python知道a指的是“内存地址0x123674283”(或任何)。 Python运行时中有一个内部表(如果我记得正确,称为“符号表”),因为在上述代码行运行之后,该表将包含
...,
'a' : 0x123674283,
...
当您将一个变量的值分配给另一个变量时
b = a
Python不会复制整个数组,因为如果它是一个大数组,那将需要很长时间。相反,它转到符号表,并将a的内存地址复制到表b中的新行。所以你结束了
...,
'a' : 0x123674283,
...,
'b' : 0x123674283,
...
所以你看到,a和b实际上是指内存中相同的位置,即同一个对象。对一个人的任何改变都会反映在另一个中,因为它们只是同一个东西的两个名字。
如果要实际制作数组的副本,则必须调用一个明确的方法。 Numpy数组有一个复制方法,您可以仅为此目的使用。所以如果你写的
b = a.copy()
那么Python将首先实际创建一个数组的副本 – 也就是说,它放置一个新的内存区域,我们假设地址为0x123904381,然后转到内存地址0x123674283,并从内存的后面部分复制数组的所有值到前者。所以你有相同的内容坐在两个不同的地方记忆。
...,
'a' : 0x123674283,
...,
'b' : 0x123904381,
...
现在,当您更改b的元素之一时,该更改将不会显示在a中,因为a和b不再引用计算机内存的相同部分。由于阵列数据有两个独立的副本,您可以更改一个而不影响另一个。