3 回答

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

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

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