为什么对numpy和python list进行相同的操作会得到不同的结果?

时间:2019-05-17 16:26:36

标签: 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]
 print('left=:',left)

我得到:left=: [2]

谁能解释为什么结果不同?预先感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

要扩展James numpy数组的解释,如果您确实想要COPY而不是数组切片的VIEW,则可以使用.copy()。但是,当您制作副本时,必须重新分配test[0]=right[0]后才能再次获得left的副本,以获取新值。

此外,对于列表方法,您设置test [0] = right [0],因此,如果在分配后print (list),则将获得[1 1]而不是原始的{{1} }。正如James所指出的,[2, 1]是列表项的副本,因此不会随着列表的更改而更新。