整数或列表的ID的python元组

时间:2013-03-16 23:48:51

标签: python-3.3

在Python 3.3 for Windows中,每个列表在创建时都会获得不同的ID:

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

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

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

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

1 个答案:

答案 0 :(得分: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)))

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

但是这些是在python脚本中,而不是像你的帖子所暗示的那样处于交互模式。但是,我在交互模式下获得了相同的结果。

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

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

当我尝试这样的事情时:

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

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