为什么数组元素的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 无论是相同数组还是不同(副本)都是相同的。 为什么两个不同数组的相同元素的id相同? 为什么多次打印时其中一个id不一样?
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
当然这也不能保证。
id(x[0])
是x.__getitem__(0)
创建的对象的指针。 每次调用该对象时,该对象都是由 numpy 代码创建的,并且除了可能的缓存之外,都会有所不同。 代表第一个数组元素的不是 x.data
中的字节 id。 array
存储是按值存储的。 列表存储是通过引用的,即指针。
这是一个重复的问题,但找到正确的 SO 链接可能很困难。
来自
id
的 python 文档
返回对象的“身份”。这是一个整数,保证该对象在其生命周期内是唯一且恒定的。具有不重叠生命周期的两个对象可能具有相同的 id() 值。
如果重复出现
id
,请检查是否有 non-overlapping lifetimes
。