比较两个numpy数组的对象id

2024-05-29 09:46:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用numpy已经有一段时间了,但是我偶然发现了一件我没有完全理解的事情:

a = np.ones(20)
b = np.zeros(10)

print(id(a)==id(b))          # prints False
print(id(a), id(b))          # prints (4591424976, 4590843504)

print(id(a[0])==id(b[0]))    # prints True 
print(id(a[0]), id(b[0]))    # prints (4588947064, 4588947064)

print(id(a[0]))              # 4588947184
print(id(b[0]))              # 4588947280

有人能解释一下在最后四份书面陈述中观察到的行为吗?另外,我知道id给了内存中实际分配的唯一对象id,但是每次我运行最后两个print语句时,我得到的id值都不同。这是预期的行为吗?在


Tags: 对象内存numpyidfalsetruenpones
2条回答

需要注意的是,Python中的所有内容都是一个对象,甚至包括数字和类。 您已经获取了2个numpy数组对象,每个对象都包含相同的值,即0。 当你说:

print('id of 0 =',id(0))

a = 0
print('id of a =',id(a))

b = a
print('id of b =',id(b))

c = 0.0
print('id of c =',id(c))

你得到的答案是(你的情况不同):

^{pr2}$

因此,整数0有一个唯一的id。整数0的id在生存期内保持不变。float0.0和其他对象的情况类似。 所以在您的例子中,a[0]或{}对象id为零将保持不变,直到或除非它是活动的,因为它们都包含0作为对象值。 每次在不同的行中打印a[0]b[0],都会返回对象的不同标识,因为您在不同的行触发它,因此生命周期也不同。 你可以试试:

print(id(a)==id(b))
print(id(a),id(b))
print(id(a[0])==id(b[0]))
print(id(a[0]),id(b[0]))

输出将是:

False
2566443478752 2566448028528
True
2566447961120 2566447961120

注意,第二行将返回numpy数组类型的对象的2个不同标识,因为这两个都是不同的列表。在

简而言之,您应该忘记依赖id来深入了解python的工作原理。它的输出受cpython实现细节、窥视孔优化和内存重用的影响。通常,{}是一条红鲱鱼。这对纽比来说尤其如此。在

在您的特定情况下,只有ab作为python对象存在。当您获取元素a[0]时,您将实例化一个新的python对象,一个numpy.float64类型的标量(或者根据您的系统,numpy.float32)可能是一个标量。这些是新的python对象,因此被赋予了一个新的id,除非解释器意识到您试图使用这个对象两次(这可能是您中间的例子中发生的情况,尽管我发现两个具有不同值的numpy.float64对象被赋予相同的id。但是,如果您首先将a[0]和{}分配给专有名称,那么奇怪的魔力就消失了,所以这可能是由于某种优化)。也有可能是内存地址被解释器重用,从而得到之前出现的id。在

只是想看看id对numpy有多无意义,即使是琐碎的视图也是带有新的id的新python对象,尽管出于所有意图和目的,它们都与原始视图一样好:

>>> arr = np.arange(3)

>>> id(arr)
140649669302992

>>> id(arr[...])
140649669667056

下面是一个在交互式shell中id重用的示例:

^{pr2}$

当然,对于numpy数组不存在^{} interning这样的事情,所以以上只是由于解释器重用了ids。id返回内存地址的事实同样只是cpython实现的一个细节。忘掉id。在

您可能只想在numpy中使用^{}和{a3}。在

相关问题 更多 >

    热门问题