IPython

时间:2017-07-06 08:58:00

标签: python arrays python-2.7 numpy ipython

为什么数组元素的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

IPython Screenshot

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

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

aCopy是数组a的副本。 两个数组的相同元素的id打印两次。 根据输出, 所有数组元素的id是否可以是相同的数组或不同(副本)是相同的,除了FIRST打印。 为什么两个不同数组的相同元素的id相同? 为什么多次打印时其中一个id不同?

2 个答案:

答案 0 :(得分:1)

id(x[0])是由x.__getitem__(0)创建的对象的指针。每次调用时,该对象都是由numpy代码创建的,并且可能的缓存可能会有所不同。它不是x.data中表示第一个数组元素的字节的id。 array存储是按值计算的。列表存储是参考,即.e。指针。

这是一个重复的问题,但找到正确的SO链接可能很困难。

来自id

的python文档
  

返回对象的“标识”。这是一个整数,在该生命周期内保证该对象是唯一且恒定的。具有非重叠生存期的两个对象可能具有相同的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

当然,这也不能保证。