Python 为什么id(A())==id(A())不同于A()是A()?

Python 为什么id(A())==id(A())不同于A()是A()?,python,Python,我对下面的python代码感到非常困惑: >>> class A(): pass ... >>> id(A()) == id(A()) True >>> id(A()) 19873304 >>> id(A()) 19873304 >>> A() is A() False >>> a = A() >>> b = A() >>>

我对下面的python代码感到非常困惑:

>>> class A(): pass  
...  
>>> id(A()) == id(A())  
True  
>>> id(A())  
19873304  
>>> id(A())  
19873304
>>> A() is A()
False
>>> a = A()
>>> b = A()
>>> id (a) == id (b)
False
>>> a is b
False
>>> id (a)
19873304
>>> id (b)
20333272
>>> def f():
...     print id(A())
...     print id(A())
...
>>> f()
20333312
20333312
我可以清楚地告诉自己python在创建对象时做了什么。

有人能告诉我更多关于发生了什么事吗?谢谢

如果在创建另一个对象之前释放其中一个对象,则两个不同的对象可以位于内存中的同一位置

也就是说,如果您分配一个对象,获取它的id,然后不再引用它,那么它就可以被释放,这样另一个对象就可以获得相同的id

相反,如果保留对第一个对象的引用,则任何后续分配的对象都必须具有不同的id。

a()
创建一个临时变量,然后将其清除

因此,下一个
A()
获取相同的id(这只是垃圾收集,尽管这种行为可能无法保证))。。。因此,当您打印它们时,它们具有相同的id

id(A()) == id(A())
必须创建两个临时变量,每个变量具有不同的id

,因为id()基于对象指针,所以只有当两个对象都在内存中时,才能保证它是唯一的。在某些情况下,的第二个实例可能重用了第一个实例(已被垃圾收集)内存中的同一个位置

print id(A()) == id(A())
您正在创建类型为
A
的对象,并将其传递给
id
函数。当函数返回时,没有对为参数创建的对象的引用。因此,引用计数变为零,准备进行垃圾收集

当您在同一表达式中再次执行
id(A())
时,您正在尝试创建另一个相同类型的对象。现在,Python可能会尝试重用先前创建的对象所使用的相同内存位置(如果它已经被垃圾收集)。否则,它将在其他位置创建它。因此,
id
可能相同,也可能不同

如果你采取

print A() is A()
我们创建了一个
A
类型的对象,并试图将其与另一个
A
类型的对象进行比较。现在,第一个对象仍在此表达式中引用。因此,它不会标记为垃圾收集,因此引用总是不同的

建议:不要在生产代码中执行类似操作。

引述

由于自动垃圾收集、免费列表和动态 从描述符的性质来看,您可能会注意到 is运算符的某些用法,如涉及比较的用法 在实例方法或常量之间。检查他们的文档以了解 更多信息

看见