在Python 3.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
True
shares_memory
的计算结果为True,但是其id
的值不同。为什么会这样?
答案 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