在Python3.x中,我不理解id和shares_memory之间的关系。这是我的代码:
import numpy as np
a = np.arange(20)
print(a)
print(id(a))
b = a[::2]
print(b)
print(id(b))
np.shares_memory(a,b)这是输出:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
2784148965456
[ 0 2 4 6 8 10 12 14 16 18]
2784148964736
Trueshares_memory的计算结果为True,但它们的id值不同。为什么会这样呢?
发布于 2019-07-28 03:50:34
内置函数id()返回Python对象的唯一标识符,在本例中为ndarray。如果两个对象具有相同的id,则它们是..同样的物体。它在Python中实现id()的常见方式是将指向对象的指针返回为一个整数。
存储在ndarray中的数据是一个单独的对象。可以有多个ndarray共享相同的存储器,即切片的结果。您可以使用arr.__array_interface__['data']检查ndarray数据中第一个元素的实际地址。
为了追踪数据的真正所有者,您可以使用base属性:
>> a = np.zeros(10)
>> b = a[1:]
>> c = b[1:] # c is made from b not a!
>> a.base is None
True
>> b.base is a
True
>> c.base is a
True请注意,数据地址和id()可能在数值上相似,因为它们通常是通过连续分配创建的。
如果两个ndarray共享基本内存,则它们共享内存。请注意,如果object的base是None,那么base就是对象本身。此外,数组缓冲区必须至少共享一个字节。
https://stackoverflow.com/questions/57233790
复制相似问题