请参见下面的代码片段
a = [[1, 2], [3, 4], [5, 6]]
b = a[1]
id(a[1]) == id(b) # True
这很容易理解,因为b
的地址和a[1]
的地址是相同的。因此,如果我更改a += 1
中的元素,b中的元素也将更改b == [4, 5]
。
但是,如果我更改为numpy数组,则情况有所不同
c = numpy.array(a)
d = c[1]
id(c[1]) == id(d) # False
但是,如果我更改c c +=1
中的元素,d
中的元素也会改变(d也会更改为array([4, 5]
)),我不明白两件事,1.为什么d
的地址和地址c[1]
的不同? 2.如果地址不同,为什么元素会同时更改?有人可以解释吗?谢谢
每次像使用ndarray
一样通过索引访问ndarray
的内部c[1]
时,都会动态创建一个新的ndarray
作为内存(缓冲区)视图。在此行id(c[1]) == id(d)
,c[1]
和d
是两个单独的ndarray
实例,它们的data
字段指向相同的内存地址(在numpy doc中称为“数据区域”)。考虑以下内容:
a = [[1, 2], [3, 4], [5, 6]]
c = np.array(a)
d = c[0]
e = c[0]
f = c[1]
print(id(d) == id(e)) # False
print(d.__array_interface__['data'][0] == e.__array_interface__['data'][0]) # True
print(d.__array_interface__['data'][0] == f.__array_interface__['data'][0]) # False
每个ndarray
保存的数据的位置可以在array interface中找到。并且由于d
和e
指向同一存储器地址处的同一数据,因此该数据地址将相同。相反,d
和f
并不指向相同的数据,因此它们的指针是不同的。