在Python 3.3 for Windows中,每个列表在创建时都会获得不同的ID:
>>> id([3])
46555784
>>> id([3])
47920192
>>> id([4])
46532048
但是如果我写一个元组要求两个列表的ID,每个列表似乎都得到相同的id:
>>> id([3]), id([4])
(43079000, 43079000)
我期待一个有两个不同ID的元组。这种行为的原因是什么?
答案 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。