【问题标题】:ID of an array element changes in IPython [duplicate]IPython中数组元素的ID更改[重复]
【发布时间】:2017-12-10 04:25:20
【问题描述】:

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

还有其他的观察在下图中

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

【问题讨论】:

  • 请不要发布屏幕截图,而是复制并粘贴文本。
  • @Divakar id 是内置的...
  • 确实很奇怪,在您的示例中使用 python(2 或 3)解释器时,id 不会改变。
  • 我不认为 Python 对这种行为做出任何保证,所以它可能是特定于实现的。反正我看不出这个有实际用途
  • 是不是因为你正在对数组进行切片,因此每次都创建一个副本?如果你 id(x) 原始的“未切片”数组,它每次都返回相同的 id。

标签: python arrays python-2.7 numpy ipython


【解决方案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

当然这也不能保证。

【讨论】:

    【解决方案2】:

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

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

    来自id的python 文档

    返回对象的“身份”。这是一个整数,保证该对象在其生命周期内是唯一且恒定的。生命周期不重叠的两个对象可能具有相同的 id() 值。

    如果您收到重复的id,请检查non-overlapping lifetimes

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 2012-07-09
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多