我使用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
值都不同。这是预期的行为吗?在
需要注意的是,Python中的所有内容都是一个对象,甚至包括数字和类。 您已经获取了2个numpy数组对象,每个对象都包含相同的值,即0。 当你说:
你得到的答案是(你的情况不同):
^{pr2}$因此,整数}对象id为零将保持不变,直到或除非它是活动的,因为它们都包含
0
有一个唯一的id。整数0
的id在生存期内保持不变。float0.0
和其他对象的情况类似。 所以在您的例子中,a[0]
或{0
作为对象值。 每次在不同的行中打印a[0]
或b[0]
,都会返回对象的不同标识,因为您在不同的行触发它,因此生命周期也不同。 你可以试试:输出将是:
注意,第二行将返回numpy数组类型的对象的2个不同标识,因为这两个都是不同的列表。在
简而言之,您应该忘记依赖}是一条红鲱鱼。这对纽比来说尤其如此。在
id
来深入了解python的工作原理。它的输出受cpython实现细节、窥视孔优化和内存重用的影响。通常,{在您的特定情况下,只有}分配给专有名称,那么奇怪的魔力就消失了,所以这可能是由于某种优化)。也有可能是内存地址被解释器重用,从而得到之前出现的
a
和b
作为python对象存在。当您获取元素a[0]
时,您将实例化一个新的python对象,一个numpy.float64
类型的标量(或者根据您的系统,numpy.float32
)可能是一个标量。这些是新的python对象,因此被赋予了一个新的id
,,除非解释器意识到您试图使用这个对象两次(这可能是您中间的例子中发生的情况,尽管我发现两个具有不同值的numpy.float64
对象被赋予相同的id
。但是,如果您首先将a[0]
和{id
。在只是想看看
id
对numpy有多无意义,即使是琐碎的视图也是带有新的id
的新python对象,尽管出于所有意图和目的,它们都与原始视图一样好:下面是一个在交互式shell中
^{pr2}$id
重用的示例:当然,对于numpy数组不存在^{} interning 这样的事情,所以以上只是由于解释器重用了
id
s。id
返回内存地址的事实同样只是cpython实现的一个细节。忘掉id
。在您可能只想在numpy中使用^{} 和{a3}。在
相关问题 更多 >
编程相关推荐