1

在适用于 Windows 的 Python 3.3 中,每个列表在创建时都会获得不同的 id:

>>> id([3])
46555784
>>> id([3])
47920192
>>> id([4])
46532048

但是如果我写一个元组询问两个列表的 id,每个列表似乎都得到相同的 id:

>>> id([3]), id([4])
(43079000, 43079000)

我期待一个具有两个不同 ID 的元组。这种行为的原因是什么?

4

1 回答 1

1

根据Python 3.3 id Documentation,CPython 的 id 给出了对象的内存地址。

当我尝试执行以下操作时:

print(id([3]))
print(id([4]))
print(id([5]))
print((id([3]), id([4])))

我为每个列表获得了相同的内存地址。

但是,如果您执行以下操作:

print(id([3]))
print(id([4]))
print(id([5]))
i = [3]
j = [4]
print((id(i), id(j)))

前 3 个打印语句和元组的第一个 id 相同,但元组中的第二个 id 不同。这是有道理的,因为创建并分配了两个不同的对象,然后检索了 id。

但正如您的帖子所暗示的那样,这些是在 python 脚本中,而不是在交互模式下。但是,我在交互模式下得到了有效的相同结果。

因此,为了回答您的问题,解释器似乎正在将数组分配到调用之间的不同位置。但是在声明元组时,它似乎分配、获取 id、空闲、分配、获取 id 和空闲,它恰好是同一个位置。

我在回应 Blender 的评论,如果我没有声明一个数组或者没有嵌套数组,我会得到所有相同的 id 结果。

当我尝试这样的事情时:

print(id([3]), id([3]))
print(id([3]), id([3,[3]]))

第一个打印语句 id 具有相同的 id 结果,但第二个打印语句 id 不同,但其中一个 id 与第一个打印语句共享相同的 id。

于 2013-04-23T14:01:47.530 回答