3 回答
TA贡献1966条经验 获得超4个赞
您可以将其id(obj)
视为对象的某种地址。它的计算方式以及值表示的内容取决于实现,您不应该对值做出任何假设。
你需要知道的:
id
只要对象存在,对象就不会改变两个共存的对象会有不同
id
的 s一个对象可能与
id
另一个已经被释放的对象相同(因为它已经消失了,它的地址可以被重用)。a is b
相当于id(a) == id(b)
。
您不能覆盖id
计算方式,也不能覆盖is
行为方式,就像您覆盖诸如__eq__
.
TA贡献1785条经验 获得超4个赞
对象的 是如何
id
计算的?https://docs.python.org/3/library/functions.html#id
你不知道。这是文档必须说的:
id
(对象)返回对象的“身份”。这是一个整数,保证该对象在其生命周期内是唯一且恒定的。具有不重叠生命周期的两个对象可能具有相同的
id()
值。
这就是 Python 做出的所有保证id()
:
它返回一个
int
没有两个对象可以同时具有相同
id()
的任何对象都不能有两个不同
id()
的 s
这就是Python 所做的所有保证。特别是,该文档明确指出了它不会做出的一项保证:
id()
s 在空间和时间上不是全局唯一的,即两个不同的对象id()
在不同的时间可能有相同的
您还会注意到,文档不保证如何id()
计算 。
但是,它确实这样说:
CPython 实现细节:这是内存中对象的地址。
这实际上再次强化id()
了这样一个事实,即通过明确声明这并不能保证如何计算 s
仅适用于 CPython,不适用于任何其他实现,例如 PyPy、Jython、IronPython、GraalPython 或 PythonOMR
是一个实现细节,这意味着它可以在任何时候,出于任何原因,在没有警告的情况下进行更改
事实上,除了 CPython 之外的任何实现实际上都不可能id()
以这种方式实现,因为所有其他实现要么有移动垃圾收集器(PyPy、PythonOMR),要么根本没有“内存地址”的概念(Jython ,IronPython,GraalPython)。
似乎在一个类中有一个地方可以进行相等,
__eq__
但是is
操作在哪里完成,以及如何id
到达?
让我将其分解为两个答案:
操作在哪里
is
完成
它被定义为 Python 语言规范的一部分,就像def
. 它不会转化为方法调用,也无法修改其行为。
是怎么
id
到达的
你不知道,不能知道,也不应该知道。你只知道它是一个标识符,实际值是不透明的。
添加回答
举报