3 回答

TA貢獻1966條經(jīng)驗 獲得超4個贊
您可以將其id(obj)
視為對象的某種地址。它的計算方式以及值表示的內(nèi)容取決于實現(xiàn),您不應該對值做出任何假設。
你需要知道的:
id
只要對象存在,對象就不會改變兩個共存的對象會有不同
id
的 s一個對象可能與
id
另一個已經(jīng)被釋放的對象相同(因為它已經(jīng)消失了,它的地址可以被重用)。a is b
相當于id(a) == id(b)
。
您不能覆蓋id
計算方式,也不能覆蓋is
行為方式,就像您覆蓋諸如__eq__
.

TA貢獻1785條經(jīng)驗 獲得超4個贊
對象的 是如何
id
計算的?https://docs.python.org/3/library/functions.html#id
你不知道。這是文檔必須說的:
id
(對象)返回對象的“身份”。這是一個整數(shù),保證該對象在其生命周期內(nèi)是唯一且恒定的。具有不重疊生命周期的兩個對象可能具有相同的
id()
值。
這就是 Python 做出的所有保證id()
:
它返回一個
int
沒有兩個對象可以同時具有相同
id()
的任何對象都不能有兩個不同
id()
的 s
這就是Python 所做的所有保證。特別是,該文檔明確指出了它不會做出的一項保證:
id()
s 在空間和時間上不是全局唯一的,即兩個不同的對象id()
在不同的時間可能有相同的
您還會注意到,文檔不保證如何id()
計算 。
但是,它確實這樣說:
CPython 實現(xiàn)細節(jié):這是內(nèi)存中對象的地址。
這實際上再次強化id()
了這樣一個事實,即通過明確聲明這并不能保證如何計算 s
僅適用于 CPython,不適用于任何其他實現(xiàn),例如 PyPy、Jython、IronPython、GraalPython 或 PythonOMR
是一個實現(xiàn)細節(jié),這意味著它可以在任何時候,出于任何原因,在沒有警告的情況下進行更改
事實上,除了 CPython 之外的任何實現(xiàn)實際上都不可能id()
以這種方式實現(xiàn),因為所有其他實現(xiàn)要么有移動垃圾收集器(PyPy、PythonOMR),要么根本沒有“內(nèi)存地址”的概念(Jython ,IronPython,GraalPython)。
似乎在一個類中有一個地方可以進行相等,
__eq__
但是is
操作在哪里完成,以及如何id
到達?
讓我將其分解為兩個答案:
操作在哪里
is
完成
它被定義為 Python 語言規(guī)范的一部分,就像def
. 它不會轉(zhuǎn)化為方法調(diào)用,也無法修改其行為。
是怎么
id
到達的
你不知道,不能知道,也不應該知道。你只知道它是一個標識符,實際值是不透明的。

TA貢獻1875條經(jīng)驗 獲得超5個贊
從您提供的 URL 頁面中:“CPython 實現(xiàn)細節(jié):這是內(nèi)存中對象的地址?!?nbsp;——所以id
基本上是一個地址,不多不少。
添加回答
舉報