docs中的身份比较描述了is
表达式的结果取决于对象身份。
运算符
is
和is not
测试对象的身份:x is y
为真,当且仅当x
和y
是同一对象。使用id()
函数确定对象的身份。x is not y
产生反真值。
但是下面的代码显示了不同的结果。
id(object()) == id(object()) # True
object() is object() # False
根据文档的描述, object() is object()
结果必须为True
。
答案 0 :(得分:4)
调用object
构造函数(我的意思是object()
),每次分配并构造具有新 available id的新 object 实例在当前范围内。
a = object()
b = object()
id(a) == id(b) # False
a is b # False
Python垃圾收集器,在对象变得不可用时(例如超出范围,解构对象等)收集对象,并使分配的内存可用。因此,它们的 id 将可用于将来将要构建的下一个对象。
因此在以下代码段中,
object() is object() # False
id(object()) == id(object()) # True
在第一行中,同时创建两个对象进行比较,然后由垃圾收集器进行收集。因此,它们具有不同的 id ,而且不相同。
在第二行中的,将创建第一个对象,并提取其 id 进行比较,然后对其进行解构(因为由垃圾收集器进行收集)。第二个对象使用第一个可用的 id ,这是从第一个对象刚刚收集的 id 。因此它们具有相同的 id !