猿问

python中id和相等的区别

对象的 是如何id计算的?https://docs.python.org/3/library/functions.html#id

似乎在一个类中有一个地方可以进行相等,__eq__但是is操作在哪里完成,以及如何id到达?


繁星点点滴滴
浏览 245回答 3
3回答

慕标5832272

您可以将其id(obj)视为对象的某种地址。它的计算方式以及值表示的内容取决于实现,您不应该对值做出任何假设。你需要知道的:id只要对象存在,对象就不会改变两个共存的对象会有不同id的 s一个对象可能与id另一个已经被释放的对象相同(因为它已经消失了,它的地址可以被重用)。a is b相当于id(a) == id(b)。您不能覆盖id计算方式,也不能覆盖is行为方式,就像您覆盖诸如__eq__.

九州编程

对象的 是如何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到达的你不知道,不能知道,也不应该知道。你只知道它是一个标识符,实际值是不透明的。

慕田峪4524236

从您提供的 URL 页面中:“CPython 实现细节:这是内存中对象的地址。” ——所以id基本上是一个地址,不多不少。
随时随地看视频慕课网APP

相关分类

Python
我要回答