Python数组元素分配

时间:2018-10-23 01:07:25

标签: python arrays copy

我对Python中关于数组变量赋值的一种简单情况感到困惑,并希望有人可以帮助我进行检查。

据我了解,如果a是一个列表,则b只是复制了a的引用,并且当您编辑b时,a也将被修改。同时,您可以使用is运算符检查其ID。例如:

a = ["a", ["a", "b"]]
b = a[1]
b.append("c")

然后,当我使用时,它将返回True

In [7]: b is a[1]
Out[7]: True

但是,如果a和b是数组,

import numpy as np
a = np.identity(3)
b = a[0, :]

然后,当我使用is进行检查时,它返回False,但是当我编辑b时,a也将被修改:

In [14]: b is a[1]
Out[14]: False
In [15]: a
Out[15]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [16]: b
Out[16]: array([0., 1., 0.])
In [17]: b *= 2
In [18]: b
Out[18]: array([0., 2., 0.])
In [19]: a
Out[19]:
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 1.]])

基本上,我认为如果is返回False,则变量将具有不同的ID和引用,这意味着它们是独立的,但是现在看来是错误的,有人可以帮我检查一下吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

访问数组的一部分将创建一个视图。 ba[0,:]是不同的视图,即使它们查看数组a的相同部分,因此即使它们的基础引用相同,它们的id值也会不同。

从技术上讲,对象的ID与其引用的对象不同,因此具有相同ID的对象将引用相同的数据,但具有相同引用的对象不一定具有相同的ID

答案 1 :(得分:0)

numpy数组的工作方式不同于Python列表。在您的示例中,b是a的第一行的 numpy视图,与指向第一个元素a的指针不同。

例如,您可以通过执行id(b)id(a[0])来检查每个变量的ID。