Identität und Äquivalenz: ist und == in Python

Es gibt viele Sprachen, die dieses Konzept haben, nicht nur Python. Nehmen wir als Beispiel Python.

"Gleich" und "gleicher Wert"

Das Wort "gleich" hat zwei Bedeutungen. "Gleich" und "gleicher Wert".

"Herr A und Herr B wohnen im selben Haus."

Was meinst du? Die meisten Leute werden denken, dass Herr A und Herr B zusammen leben. Mit anderen Worten, Herr A und Herr B leben im "gleichen" Haus.

"Herr A und Herr B tragen die gleichen Kleider."

Was meinst du? Ich denke, dass nur wenige Leute denken, dass Herr A und Herr B "die gleichen" Kleider tragen, das heißt, zwei Menschen tragen ein Kleidungsstück. Es ist natürlich anzunehmen, dass Herr A und Herr B jeweils Kleidung tragen und dass die Kleidung, die Herr A trägt, und die Kleidung, die Herr B trägt, beispielsweise Kleidung desselben Herstellers und desselben Designs sind. ist.

Vielleicht sind die Dinge selbst anders, aber in gewissem Sinne können sie gleich genannt werden. Diese Beziehungen werden Äquivalenz oder Äquivalenz genannt.

Die Implementierung ist erforderlich, um die Äquivalenz zu bestimmen

Übrigens, wenn es keine einfache Sache wie eine ganze Zahl ist, sondern eine komplizierte Sache wie Kleidung, muss man darüber nachdenken, was als "gleichwertig" angesehen wird. Wenn die Größe der Kleidung ebenfalls in der Bedingung enthalten ist, wenn Herr A und Herr B unterschiedliche Größen haben, egal wie ähnlich sie sind, werden sie nicht als gleich angesehen. Wenn Sie die Größe der Kleidung nicht in den Zustand einbeziehen, wenn Sie ein Bekleidungskaufmann sind und der Kunde sagt "Da es sich um ein defektes Produkt handelt, ersetzen Sie es durch den gleichen Preis!", Können Sie eine andere Größe mitbringen. Vielleicht.

Wenn Sie es aufschreiben, ist es in vielen Fällen "gleich", wenn es "gleich" ist. Dies ist jedoch nicht immer der Fall, da dies davon abhängt, was als "gleich" angesehen wird.

Warum muss zwischen demselben und demselben Wert unterschieden werden?

"Mr. A und Mr. B sitzen im selben Auto. Mr. A's Auto knallte gegen die Wand."

Ist Herr B sicher?

Wenn Herr A und Herr B im selben Auto wären, wäre Herr B auch nicht sicher. Selbst wenn Herr A und Herr B im selben Auto (desselben Modells) sitzen, hat Herr B nichts damit zu tun, wenn sie nicht im selben Auto sitzen.

"Variable a und Variable b zeigen auf dieselbe Liste. Ich habe ein Element aus der Liste der Variablen a entfernt."

Wurde das Element aus der Liste der Variablen b entfernt?

Wenn Variable a und Variable b identisch sind, wurde das Element ebenfalls aus der Liste von b entfernt. Selbst wenn die Variable a und die Variable b den gleichen Wert haben, bleibt die Liste von b erhalten, wenn sie nicht gleich sind.

Auf diese Weise sind "gleicher" und "gleicher Wert" ähnliche und unterschiedliche Konzepte, aber im Allgemeinen wird der gleiche Wert häufiger verwendet als der gleiche Wert. Es ist oft notwendig, zwischen identischen und äquivalenten Werten zu unterscheiden, wenn der Vergleich für ein veränderliches Objekt wie eine Liste erfolgt. In einem Verarbeitungssystem wie Python, das Speicher außerhalb der Sichtweite des Programmierers zuweist, muss selten geprüft werden, ob unveränderliche Objekte tatsächlich auf dasselbe Objekt verweisen. Daher wird es selten für unveränderliche Objekte verwendet.

Was sind die Operatoren zum Überprüfen der Identität und Äquivalenz in Python?

In Python ist der Operator, der die Identität überprüft, und der Operator, der die Gleichheit überprüft, ==. Der Operator, der nach nicht identischen Werten sucht, ist dies nicht, und der Operator, der nach nicht identischen Werten sucht, ist! =.

== und! = Überlastung

Die Operatoren ==,! = Können durch spezielle Methodennamen überladen werden. (Das heißt, Sie können definieren, wie die Äquivalenz verglichen werden soll, indem Sie eine Methode mit einem speziellen Namen erstellen.) Operatoren, die auf Identität prüfen, können nicht überladen werden.

In Python2 gibt es zwei Arten von speziellen Methodennamen, die == überladen (jedoch seit Python 2.1). In Python3 wurde einer abgeschafft und wurde zu einem Typ.

Die speziellen Methodennamen, die sowohl in Python 2 (aber Python 2.1 oder höher) als auch in Python 3 verwendet werden können, sind "eq (self, other)", was == entspricht, und "ne (self, other)", was! = Entspricht. .. Wenn Sie es in Zukunft erstellen möchten, zögern Sie nicht, es zu verwenden, wenn Sie nicht vorhaben, es unter Python 2.1 oder früher auszuführen.

Hier ist ein Codebeispiel.

class Car:
    def __init__(self, maker, model, color, owner):
        self.maker = maker
        self.model = model
        self.color = color
        self.owner = owner
    def __eq__(self, other):
        try:
            if (self.maker == other.maker and self.model == other.model and
                   self.color == other.color):
                return True  #Auch wenn die Besitzer unterschiedlich sind, gelten sie als dasselbe Auto
        except AttributeError:
            pass
        return False
    def __ne__(self, other):
        return not self == other

my_car = Car("Nissan", "GT-R", "Red", "my name")
your_car = Car("Nissan", "GT-R", "Red", "your name")
his_car = Car("Nissan", "Note", "Blue", "his name")

my_garage = [my_car]

print(my_car == your_car) # ==> True
print(my_car == his_car) # ==> False
print(my_car is my_car) # ==> True
print(my_car is my_garage[0]) # ==> True
print(your_car is my_garage[0]) # ==> False
print(your_car == my_garage[0]) # ==> True

Die spezielle Methode "cmp (self, other)", die nur in Python2 verwendet werden kann, ist ein Operator, der die sechs Operatoren <, <=, ==,! =,> =,> Auf einmal und "cmp (self)" definiert. Wenn other) negativ ist, bedeutet es <, wenn es 0 ist, bedeutet es ==, und wenn es positiv ist, bedeutet es>. Ich empfehle es überhaupt nicht, da es in 3 nicht verwendet werden kann, aber es scheint, dass int sogar in der Python 2.7-Serie in cmp` implementiert ist, also werde ich es für alle Fälle einführen.

Es ist ein Schlangenbein. Bei der neuen Methode müssen Sie zum Implementieren des Größenvergleichs zusätzlich zu "eq", aber Python 2.7, "ne", "lt", "le", "ge", "gt" definieren In den folgenden und 3 wird unter Verwendung von functools.total_ordering __eq ___ und __lt__, __le__ Wenn Sie eines von "ge", "gt" definieren, wird der Rest für Sie erledigt.

Andere

Ist es möglich, dass die in Python integrierten Klassen identisch, aber nicht identisch sind?

Der Gleitkomma-Typ nan (keine Zahl) ist in keinem Vergleich der gleiche Wert. Selbst wenn Sie es mit sich selbst vergleichen, wird es daher nicht der gleiche Wert sein.

nan = float("nan")
print(nan is nan)  # ==> True
print(nan == nan)  # ==> False

Ich habe gehört, dass Sie im Vergleich zu None anstelle von == verwenden sollten. Warum?

Wenn ==, wie oben erwähnt, der Benutzer es nach Belieben implementieren kann, können in einigen Fällen Ausnahmen wie TypeError und AttributeError auftreten. True wird möglicherweise zurückgegeben, obwohl es nicht None ist, und die Verarbeitung ist möglicherweise sehr umfangreich. Hmm. Wenn Sie jedoch mit is vergleichen, können Sie definitiv vergleichen, ob der Wert None ist oder nicht. Dies liegt jedoch daran, dass [durch die Sprachspezifikationen garantiert] nur ein Objekt mit dem Wert None vorhanden ist (http://docs.python.jp/2/reference/datamodel.html#types). Du kannst es schaffen. Diese Verwendung ist problematisch, wenn mehrere Objekte mit demselben Wert vorhanden sein können.

Ist oder ==, was ist schneller?

Grundsätzlich ist es schneller. Es gibt jedoch nur wenige Situationen, in denen Sie eine der beiden verwenden können.

Wenn man Ints mit is vergleicht, werden sie gleich. Ist es in Ordnung, int mit is zu vergleichen?

Der gleiche Wert kann der gleiche sein oder auch nicht. Verwenden Sie ==, um Ints zu vergleichen, es sei denn, Sie möchten die Identität für einen bestimmten Zweck überprüfen.

Wenn man strs mit is vergleicht, sind sie gleich. Ist es in Ordnung, str zu vergleichen?

Das gleiche wie oben.

Ist wie JavaScript ===, nicht wahr?

falsch. Da === in JavaScript ein Operator ist, der prüft, ob die Werte ohne Typkonvertierung gleich sind, prüfen wir, ob sie gleich sind. Python prüft, ob es dasselbe ist. Um in Python etwas Ähnliches zu tun, betrachten Sie beispielsweise "Typ (a) ist Typ (b) und a == b".

Recommended Posts

Identität und Äquivalenz: ist und == in Python
Unterschied zwischen == und ist in Python
Unterschiede in Identität, Äquivalenz und Aliasnamen
Python ist einfach
Was ist Python?
Python ist eine Instanz
Verwendung ist und == in Python
Was ist Python?
Was ist "funktionale Programmierung" und "objektorientiert"? Python Edition
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Über den Unterschied zwischen "==" und "is" in Python
Was vergleichst du mit Python und ==?
Einheitsmatrix und inverse Matrix: Lineare Algebra in Python <4>
[Python] Komprimieren und dekomprimieren
Python Int ist unendlich
Python- und Numpy-Tipps
[Python] Pip und Wheel
[Python] Was ist Pipeline ...
Python Iterator und Generator
Python-Pakete und -Module
Vue-Cli- und Python-Integration
Ruby, Python und Map
Python-Eingabe und Ausgabe
Python und Ruby teilen sich
Metaklasse und Instanz
Python # Überprüfen Sie die Typidentität
Python asyncio und ContextVar
[Python] Was ist virtualenv?
Das Einrückungsverhalten von json.dumps unterscheidet sich zwischen python2 und python3
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python-Runde ist nicht streng rund
[Python] Effizienteres Debuggen!
Python: Klassen- und Instanzvariablen
3-3, Python-Zeichenfolge und Zeichencode
Python 2-Serie und 3-Serie (Anaconda Edition)
Python und Hardware-Verwenden von RS232C mit Python-
Python auf Ruby und wütend Ruby auf Python
Python-Einzug und String-Format
Python Real Number Division (/) und Integer Division (//)
Installieren Sie Python und Flask (Windows 10)
Verwendung von __dict__ in Python
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
Apache mod_auth_tkt und Python AuthTkt
Python ist schmerzhaft. Aber benutze
Lernen Sie Python-Pakete und -Module kennen
# 2 [python3] Trennung und Kommentar aus
Flache Python-Kopie und tiefe Kopie
Python ist eine Sprache für Erwachsene
Python und Ruby Slice Memo
Python-Installation und grundlegende Grammatik
Ich habe Java und Python verglichen!
Flache Python-Kopie und tiefe Kopie
Objektäquivalenzbeurteilung in Python
Über Python, len () und randint ()
Die Python 3.4-Serie ist sicher für die Installation und Ausführung von Python Kivy (macOS).