在Python中,给定一个类a,为什么对id(a())的后续调用返回相同的值?

在Python中,给定一个类a,为什么对id(a())的后续调用返回相同的值?,python,python-2.7,built-in,Python,Python 2.7,Built In,我正在使用Python2.7解释器,发现下面的行为非常有趣,值得一提 给定一个空类: class A(): pass 我可以创建单独的实例,并且像预期的那样,它们具有单独的ID: a = A() b = A() id(a) >>> XXXXXXXX44 id(b) >>> XXXXXXXX16 但是,当我在没有变量保存正在创建的实例的情况下,对内置id进行后续调用时,我看到返回了相同的id id(A()) >>> XXXXXXXX

我正在使用Python2.7解释器,发现下面的行为非常有趣,值得一提

给定一个空类:

class A():
    pass
我可以创建单独的实例,并且像预期的那样,它们具有单独的ID:

a = A()
b = A()
id(a)
>>> XXXXXXXX44
id(b)
>>> XXXXXXXX16
但是,当我在没有变量保存正在创建的实例的情况下,对内置id进行后续调用时,我看到返回了相同的id

id(A())
>>> XXXXXXXX88
id(A())
>>> XXXXXXXX88
更奇怪的是,当我在调用
id(a())
之间混合使用另一个由变量持有的实例化时,行为会发生变化:

id(A())
>>> XXXXXXXX88
a = A()
>>> XXXXXXXX88
id(A())
>>> XXXXXXXX44
对这种行为有什么直觉吗?

id(A())
创建一个
A
实例,该实例在
id
方法退出后立即被垃圾收集

因此,对
id(a())
的新调用将重用该引用


如果将第一个引用存储在变量中,Python将无法重用该引用,因为它已被使用。

在编写本文之后,我开始怀疑实例在未绑定时会立即被垃圾收集,ID也会被重用。不过,如果有人知道的话,我希望你能给我一个彻底的解释。是的,好吧!很好的发现。谢谢你的快速回答。顺便说一句,你自己已经找到了答案。不过我不确定,最好知道