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