为什么numpy和python列表上的相同操作会得到不同的结果?

为什么numpy和python列表上的相同操作会得到不同的结果?,python,list,numpy,Python,List,Numpy,我尝试用numpy数组和元素完全相同的列表上的第二个元素的值替换第一个元素的值,但得到的结果不同 1) 在numpy阵列上测试: test=np.array([2,1]) left=test[:1] right=test[1:] test[0]=right[0] print('left=:',left) 我得到:left=:[1] 2) 在python列表上测试: test=[2,1] left=test[:1] right=test[1:] test[0]=right[0] pri

我尝试用numpy数组和元素完全相同的列表上的第二个元素的值替换第一个元素的值,但得到的结果不同

1) 在numpy阵列上测试:

test=np.array([2,1])
left=test[:1]
right=test[1:]
test[0]=right[0]
print('left=:',left)
我得到:
left=:[1]

2) 在python列表上测试:

 test=[2,1]
 left=test[:1]
 right=test[1:]
 test[0]=right[0]
 print('left=:',left)
我得到:
left=:[2]

有人能解释为什么结果不同吗?提前感谢。

切片(使用冒号索引)numpy数组会将视图返回到numpy数组中,因此当您稍后更新test[0]的值时,它会更新left的值,因为left只是数组中的一个视图

当您切片到python列表中时,它只返回一个副本,因此当您更新test[0]的值时,left的值不会改变


之所以这样做,是因为numpy数组通常非常大,创建大量数组副本可能非常麻烦。

要详细介绍numpy数组的解释,如果您确实需要副本而不是数组切片的视图,可以使用
.copy()
。但是,在复制时,必须在重新指定
test[0]=right[0]
后再次复制left以获取新值


另外,关于列表方法,您将test[0]=right[0],因此,如果在分配后
打印(列表)
,您将获得
[1 1]
,而不是原始的
[2,1]
。正如James指出的,
left
是列表项的副本,因此不会随列表的更改而更新。

请重新格式化代码块以便于阅读。使用格式化程序中的代码块图标或反引号。@kcw78,谢谢您的建议。这是我第一次发布关于堆栈溢出的问题,所以我对格式问题不太了解。我已经修改了代码的格式,希望现在更容易阅读。非常感谢,詹姆斯。现在我明白了。谢谢@kcw78。当我试图在numpy数组上实现合并排序算法时,遇到了这个问题,但它不起作用。但是当我尝试在切片列表时添加.copy()时,它起了作用。所以我想到了问题的根源。实际上,我在《Python for data analysis》一书中读到,numpy数组的切片只是它的一个视图,但直到James和您为我指出它之前,我才真正理解它。再次感谢大家。