IPython 中数组元素的 ID 发生变化[重复]

问题描述 投票:0回答:2

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

用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不一样?

python arrays python-2.7 numpy ipython
2个回答
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

当然这也不能保证。


1
投票

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

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

来自

id

的 python 文档

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

如果重复出现

id
,请检查是否有
non-overlapping lifetimes

© www.soinside.com 2019 - 2024. All rights reserved.