id和numpy.shares_memory之间是什么关系?

时间:2019-07-27 15:58:58

标签: python python-3.x numpy

在Python 3.x中,我不了解idshares_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
True

shares_memory的计算结果为True,但是其id的值不同。为什么会这样?

1 个答案:

答案 0 :(得分:0)

内置函数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 共享内存(如果它们共享基数)。请注意,如果对象的基数为None,则基数就是对象本身。函数shares_memory的功能如下:

def shares_memory(a, b):
    base_of_a = a if a.base is None else a.base
    base_of_b = b if b.base is None else b.base
    return base_of_a is base_of_b