关于python:IPython中数组元素的ID更改

ID of an array element changes in IPython

本问题已经有最佳答案,请猛点这里访问。

为什么数组元素的ID不断变化?

1
2
3
4
5
6
7
    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

IPython屏幕截图

用python脚本编写时不是这种情况
用python脚本编写时,我们得到相同的ID
Python script screenshot

下图中还有其他观察结果
Behaviour when printed ID of copy of the array for the same element

aCopy是数组a的副本。
两个数组的相同元素的id打印两次。
根据输出,
除了第一个打印外,所有数组元素的ID(无论是同一数组还是不同的(副本))都相同。
为什么两个不同数组的相同元素的id相同?
为什么多次打印时其中一个id不同?


CPython中的id()返回值基于参数的内存地址。

在程序中打印时,两次打印之间没有任何反应,因此很有可能为x[0]结果重用了相同的地址,该结果每次都是新创建的对象。并且它是打印后收集的垃圾。

另一方面,在IPython中,每个用户输入都永久存储在历史记录中,因此在打印之间创建对象,这使得x[0]对象不太可能放置在相同的内存地址。

在IPython中一次执行两次打印时,我为两个对象获得了相同的ID,但是每次执行此操作时都得到了一个不同的ID:

1
2
3
4
5
6
7
8
9
10
11
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文档

Return the"identity" of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the sameid()value.

如果重复出现id,请检查non-overlapping lifetimes