Python-Dunder-Methode für 'ist' [doppelt]

8
    

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.

    
Edgar Aroutiounian 28.08.2013, 19:19
quelle

1 Antwort

10

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 und not 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).

    
abarnert 28.08.2013, 19:21
quelle

Tags und Links