为了账号安全,请及时绑定邮箱和手机立即绑定

python中id和相等的区别

python中id和相等的区别

繁星点点滴滴 2022-06-22 17:32:16
对象的 是如何id计算的?https://docs.python.org/3/library/functions.html#id似乎在一个类中有一个地方可以进行相等,__eq__但是is操作在哪里完成,以及如何id到达?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

您可以将其id(obj)视为对象的某种地址。它的计算方式以及值表示的内容取决于实现,您不应该对值做出任何假设。

你需要知道的:

  1. id只要对象存在,对象就不会改变

  2. 两个共存的对象会有不同id的 s

  3. 一个对象可能与id另一个已经被释放的对象相同(因为它已经消失了,它的地址可以被重用)。

  4. a is b相当于id(a) == id(b)

您不能覆盖id计算方式,也不能覆盖is行为方式,就像您覆盖诸如__eq__.


查看完整回答
反对 回复 2022-06-22
?
九州编程

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到达的

你不知道,不能知道,也不应该知道。你只知道它是一个标识符,实际值是不透明的。


查看完整回答
反对 回复 2022-06-22
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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



查看完整回答
反对 回复 2022-06-22
  • 3 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信