Vor allem vielen Python-Einsteigern erschließt sich der Unterschied zwischen dem == und dem is Operator nicht direkt. In diesem Artikel werden die beiden Operatoren kurz vorgestellt, sodass dann der Unterschied näher erläutert werden kann.

Beide Operatoren sind sgn. binäre, vergleichende Operatoren - beide Operatoren erwarten also genau zwei Operanten, welche dann verglichen werden, sodass der Ausdruck die Werte True oder False wiedergeben kann.

Der Unterschied zwischen dem == und dem is Operator ist in einem Satz erklärt: Während der == Operator die Werte seiner beiden Operanten vergleicht, vergleicht der is Operator die Identität der beiden Operanten. Um zu verstehen was dieser Satz bedeutet muss zunächst der Unterschied zwischen Objektgleichheit und gleicher Identität geklärt werden.

Jedes komplexe Python-Objekt besitzt eine Objekt-Identität, welche eine eindeutige Identifizierung eines Objekt ermöglicht. Wird ein neues Objekt erzeugt besitzt dieses eine neue, noch nicht vergeben, also eindeutige Objektidentität. Ist ein Objekt einer Variable a zugewiesen, speichert diese Variable nur einen Verweis auf dieses Objekt. Wird einer zweiten Variable b nun der Wert der Variable a zugewiesen (also b=a), so zeigen die Variablen a und b auf das selbe Objekt. Zwei komplexe Objekte mit unterschiedlicher Identität können den selben Wert repräsentieren (z.B. zwei leeren Listen).

Das Verhalten der beiden Operatoren wird in dem folgenden Beispiel deutlich, in dem zunächst zwei Variablen denen das selbe Objekt zugewiesen ist, und dann zwei Variablen mit zwei unterschiedlichen Objekte mit dem selben Wert vergleichen werden:

liste_1 = [1, 2, 3]
liste_2 = liste_1

print(liste_1, liste_2)
""" Ausgabe: [1, 2, 3] [1, 2, 3] """

print(liste_1 == liste_2)
""" Ausgabe: True - liste_1 und liste_2 haben den selben Wert """

print(liste_1 is liste_2)
""" Ausgabe: True - liste_1 und liste_2 repräsentieren das selbe Objekt """



liste_3 = [1, 2, 3]
liste_4 = [1, 2, 3]

print(liste_3, liste_4)
""" Ausgabe: [1, 2, 3] [1, 2, 3] """

print(liste_3 == liste_4)
""" Ausgabe: True - liste_3 und liste_4 haben den selben Wert """

print(liste_3 is liste_4)
""" Ausgabe: False - liste_3 und liste_4 repräsentieren NICHT das selbe Objekt """

Das Verhalten des == Operators kann in eigenen Klassen einfach durch die __eq__-Methode bestimmt werden. Diese Methode wird beim Aufrufen des == Operators aufgerufen - der Vergleichsausdruck gibt dann den Rückgabewert der Methode zurück. Ein Überschreiben des is Operators ist in Python nicht möglich.

In dem folgendem Beispiel werden Instanzen der Klasse Person vergleichen. Der == Operator soll bei identischem Namen True zurückgeben, anderenfalls False:

class Person(object):
def __init__(self, id, name):
self.id = id
self.name = name
def __eq__(self, other):
return self.name == other.name

person_1 = Person(1, "Max")
person_2 = Person(2, "Theo")
person_3 = Person(3, "Max")

print(person_1 == person_2)
""" Ausgabe: False """

print(person_1 == person_3)
""" Ausgabe: True """

print(person_1 is person_3)
""" Ausgabe: False """

Bei primitiven Typen (bool, int, float, string, byte, complex) existiert keine Unterscheidung zwischen Identität und Wert. Ausdrücke wie 5 is 5 oder "Max" is "Max" geben daher immer True zurück.

Abschließend kann festgehalten werden, dass der Unterschied zwischen den beiden Operatoren == und is einfach, aber dennoch wichtig ist. Das falsche Verwenden der Operatoren führt zu nur schwer zu findenden Fehlern.