问题描述
为什么id()函数为python中数组的备用元素返回相同的值?我使用以下代码
import numpy as np
a = np.array([3,6,9,12,5])
print('array id\t',id(a))
print(a[0],'\t',id(a[0]))
print(a[1],id(a[1]))
print(a[2],id(a[2]))
print(a[3],id(a[3]))
print(a[4],id(a[4]))
我得到的输出如下:
array id 59184176
3 200295200
6 200295136
9 200295200
12 200295136
5 200295200
解决方法
这是特定于numpy数组工作方式的。数据以有效的方式存储,而不会产生为每个元素存储对象的成本。相反,当您从数组中读取对象时,将根据需要创建对象。
这意味着每次您执行a[0]
等操作时,都会创建并返回一个新对象。如果不保留对它的引用,则该对象将被丢弃,并且该ID可以重用。因此,在您的情况下,不久之后,您将获得另一个具有相同ID的对象。
您可以说a[0]
每次被调用时都会创建一个新对象,因为只是尝试
a[0] is a[0]
评估为假(至少在我尝试时)。
或者,如果您同时获得对从数组中获取的所有对象的引用,则它们都将具有不同的ID。
[id(x) for x in a]
# [4538316976,4538316784,4538317168,4538317200,4538317296]