Diese Frage hat hier schon eine Antwort:
Beim Durchsehen der Dokumente und insbesondere hier Ссылка kann ich immer noch nicht finden die dunder / protocol-Methode, die die Implementierung des Python-Schlüsselworts is
definiert. Welche Methode bestimmt es? Soweit ich das verstehe, vergleicht% is
die Ergebnisse der Funktion id
, wenn zwei Objekte aufgerufen werden.
Es gibt keine Dunder-Methode für is
. Sie können es nicht überschreiben, und das ist beabsichtigt. Der ganze Punkt von is
ist, dass es Ihnen sagt, ob zwei Ausdrücke auf denselben Wert verweisen. Also muss es für zwei verschiedene Werte per Definition falsch sein. Es gibt also keine Notwendigkeit, es zu überschreiben.
Wie die Dokumente setzen Sie es:
Die Operatoren
is
undnot is
testen auf Objektidentität:x is y
ist wahr genau dann, wenn x und y dasselbe Objekt sind.
(Es gibt ein wenig mehr in den Datenmodell-Dokumenten . )
Außerdem vergleicht is
nicht die Ergebnisse von id
.
id
wurde so definiert, dass "eine Ganzzahl zurückgegeben wird, die eindeutig ist und konstant für dieses Objekt während seiner Lebenszeit ". Was bedeutet, dass is
sicherlich könnte% /% verwenden id
, aber ich kenne keine Implementierung, wo es tut.
Das heißt, in CPython macht es effektiv dasselbe unter den Deckblättern - is
überprüft, ob die Zeiger gleich sind, während id
wandelt den Zeiger in eine Ganzzahl um und gibt sie zurück. Der einzige Unterschied zwischen der direkten Implementierung und der Implementierung über id
wäre ein zusätzliches Paar von Funktionsaufrufen und eine Umwandlung, die auf keinen Maschinencode kompiliert würde ...
Aber in anderen Implementierungen ist selbst das nicht wahr. (Was offensichtlich sein sollte, wenn man bedenkt, dass Jython und PyPy in Sprachen geschrieben sind, die nicht einmal einen Zeiger haben.) Zum Beispiel überprüft is
in PyPy, dass die zugrunde liegenden RPython-Objekte identisch sind. while id
gibt einen Schlüssel zurück, der im laufenden Betrieb generiert wurde (und zwischengespeichert wird, wenn Sie später id
auf demselben Wert aufrufen).
Tags und Links python