为什么数组元素的ID会不断变化?
In [43]: x = np.array([[1,2,3],[4,5,6],[7,8,9]])
In [44]: print id(x[0])
30836416
In [45]: print id(x[0])
31121344
In [46]: print id(x[0])
31471808
当用python脚本编写时不是这种情况 当用python脚本编写时,我们得到相同的ID
aCopy是数组a的副本。 两个数组的相同元素的id打印两次。 根据输出, 所有数组元素的id是否可以是相同的数组或不同(副本)是相同的,除了FIRST打印。 为什么两个不同数组的相同元素的id相同? 为什么多次打印时其中一个id不同?
答案 0 :(得分:1)
id(x[0])
是由x.__getitem__(0)
创建的对象的指针。每次调用时,该对象都是由numpy代码创建的,并且可能的缓存可能会有所不同。它不是x.data
中表示第一个数组元素的字节的id。 array
存储是按值计算的。列表存储是参考,即.e。指针。
这是一个重复的问题,但找到正确的SO链接可能很困难。
来自id
返回对象的“标识”。这是一个整数,在该生命周期内保证该对象是唯一且恒定的。具有非重叠生存期的两个对象可能具有相同的id()值。
如果您重复id
,请检查non-overlapping lifetimes
。
答案 1 :(得分:1)
CPython中的id()
返回值基于参数的内存地址。
在程序中打印时,打印之间不会发生任何事情,因此更有可能为x[0]
结果重复使用相同的地址,每次都是新创建的对象。它是印刷后的垃圾收集。
另一方面,在IPython中,每个用户输入都永久存储在历史记录中,因此在打印之间创建对象,这使得x[0]
对象更不可能放在同一个内存地址。
在IPython中进行两次打印时,我得到两个对象的相同ID,但每次执行时都会有不同的ID:
In [28]: print id(x[0]); print id(x[0])
140000637403008
140000637403008
In [29]: print id(x[0]); print id(x[0])
140000637402608
140000637402608
In [30]: print id(x[0]); print id(x[0])
140000637402928
140000637402928
当然,这也不能保证。