Frage

Mein Google-fu hat mich im Stich gelassen.

Sind in Python die folgenden beiden Tests auf Gleichheit gleichwertig?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

Gilt dies für Objekte, bei denen Sie Instanzen vergleichen würden (a list sagen)?

Okay, das beantwortet meine Frage:

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

Also == testet den Wert wo is Tests, um zu sehen, ob es sich um dasselbe Objekt handelt?

War es hilfreich?

Lösung

is wird True zurück, wenn zwei Variablen auf das gleiche Objekt zeigen, == wenn die von den Variablen genannten Objekte gleich sind.

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:] # Make a new copy of list `a` via the slice operator, and assign it to variable `b`
>>> b is a
False
>>> b == a
True

In Ihrem Fall der zweite Test funktioniert nur, weil Python kleine ganze Objekte speichert, die eine Implementierung Detail. Für größere ganze Zahlen sind, funktioniert das nicht:

>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

Das gleiche gilt für Stringliterale true:

>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True

Bitte finden Sie unter diese Frage als auch.

Andere Tipps

Es gibt eine einfache Faustregel gilt: Sie zu sagen, wann == oder is zu verwenden.

  • == ist für Wertgleichheit . Verwenden Sie es, wenn Sie möchten wissen, ob zwei Objekte den gleichen Wert haben.
  • is ist für Referenz Gleichheit . Verwenden Sie es, wenn Sie möchten wissen, ob zwei Referenzen auf dasselbe Objekt verweisen.

In der Regel, wenn Sie etwas auf eine einfache Art vergleichen, Sie überprüfen in der Regel für Wertgleichheit , so sollten Sie == verwenden. Zum Beispiel ist die Absicht, Ihrem Beispiel wahrscheinlich zu prüfen, ob x einen Wert gleich 2 (==) hat, nicht, ob x wahrsten Sinne des Wortes bezieht sich auf das gleiche Objekt wie 2.


Etwas anderes zu beachten: Aufgrund der Art und Weise der CPython Referenz-Implementierung arbeitet, werden Sie unerwartete und inkonsistente Ergebnisse, wenn Sie versehentlich is verwenden als Referenz Gleichheit auf ganze Zahlen vergleichen:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

Das ist ziemlich viel, was wir erwartet hatten: a und b den gleichen Wert haben, aber sie sind getrennte Einheiten. Aber was ist das?

>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True

Dies ist unvereinbar mit dem früheren Ergebnis. Was ist hier los? Es stellt sich heraus, die Referenz-Implementierung von Python-Caches integer Objekte im Bereich -5..256 als Singleton-Instanzen aus Leistungsgründen. Hier ist ein Beispiel dieser demonstriert:

>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False

Dies ist ein weiterer offensichtlicher Grund nicht is zu verwenden: das Verhalten auf Implementierungen überlassen wird, wenn Sie irrtümlich für Wertgleichheit mit sind

.

== bestimmt, ob die Werte gleich sind, während is bestimmt, ob sie genau das gleiche Objekt und gleich sind.

  

Gibt es einen Unterschied zwischen == und is in Python?

Ja, sie haben einen sehr wichtigen Unterschied.

== : Check für die Gleichstellung - die Semantik sind, dass gleichwertige Objekte (die nicht unbedingt das gleiche Objekt sind) prüft als gleich. Da die Dokumentation sagt :

  

Die Operatoren <,>, ==,> =, <= und! = Die Werte von zwei Objekten vergleichen.

is : Check für Identität - die Semantik ist, dass das Objekt (wie im Speicher) ist das Objekt. Wieder sagt die Dokumentation :

  

Die Betreiber is und is not Test für Objektidentität: x is y ist wahr   wenn und nur wenn x und y ist das gleiche Objekt. Objektidentität ist   Verwendung der id() Funktion bestimmt. x is not y ergibt die inverse   Wahrheitswert.

Damit ist die Prüfung auf Identität die gleiche wie für die Gleichheit der IDs der Objekte prüfen. Das heißt,

a is b

ist die gleiche wie:

id(a) == id(b)

wo id ist die eingebaute Funktion, die eine Ganzzahl zurückgibt, dass „garantiert unter gleichzeitig vorhandene Objekte eindeutig sein“ (siehe help(id)) und wo a und b irgendwelche beliebige Objekte.

Andere Nutzungs Anfahrt

Sie sollten diese Vergleiche für ihre Semantik verwenden. Verwenden Sie is Identität zu überprüfen und == Gleichheit zu überprüfen.

PEP 8, der offizielle Python Style Guide für die Standardbibliothek erwähnt auch zwei anwendungs~~POS=TRUNC für is :

  

Vergleiche zu Singletons wie None sollten immer mit is erfolgen oder   is not, nie die Gleichheitsoperator.

     

Auch passen sie zu schreiben if x, wenn Sie wirklich if x is not None bedeuten -   z.B. wenn bei der Prüfung, ob eine Variable oder ein Argument, dass standardmäßig None   auf einen anderen Wert gesetzt wurde. Der andere Wert könnte eine Art (z   als Container), die in einem Booleschen Kontext falsch sein könnten!

Herleitung Gleichheit von Identität

Wenn is wahr ist, Gleichheit kann in der Regel zu entnehmen ist - logisch, wenn ein Objekt selbst ist, dann sollte es sich als gleichwertig testen.

In den meisten Fällen sind diese Logik ist wahr, aber es stützt sich auf der Umsetzung der __eq__ speziellen Methode. Da die docs sagen wir,

  

Das Standardverhalten für Gleichheitsvergleich (== und !=) basiert auf   die Identität der Objekte. Daher Gleichheitsvergleich von Instanzen   mit der gleichen Identität ergibt Gleichheit und Gleichheit Vergleich   Instanzen mit unterschiedlichen Identitäten ergibt Ungleichheit. EIN   Motivation für dieses Standardverhalten ist der Wunsch, dass alle Objekte   reflexive sein sollte (d.h. x ist y impliziert x == y).

und im Interesse der Kohärenz empfiehlt:

  

Gleichheit Vergleich sollte reflexiv sein. Mit anderen Worten, identisch   Objekte sollten gleich vergleichen:

     

x is y impliziert x == y

Wir können sehen, dass dies das Standardverhalten für benutzerdefinierte Objekte ist:

>>> class Object(object): pass
>>> obj = Object()
>>> obj2 = Object()
>>> obj == obj, obj is obj
(True, True)
>>> obj == obj2, obj is obj2
(False, False)

Die contra ist auch in der Regel wahr - wenn Somethings Tests als not gleich, können Sie in der Regel ableiten, dass sie Objekt nicht gleich sind.

Da Tests für die Gleichstellung angepasst werden können, ist diese Folgerung nicht immer wahr hält für alle Typen.

Eine Ausnahme

Eine bemerkenswerte Ausnahme ist nan - es immer testet nicht gleich selbst:

>>> nan = float('nan')
>>> nan
nan
>>> nan is nan
True
>>> nan == nan           # !!!!!
False

für Identität überprüfen kann viel sein ein viel überprüfen schneller als auf Gleichheit überprüft (die möglicherweise rekursiv überprüft Mitglieder erforderlich).

Aber es kann nicht für Gleichheit ersetzt werden, in dem Sie mehr als ein Objekt als äquivalent finden.

Beachten Sie, dass die Gleichstellung von Listen und Tupeln verglichen davon aus, dass Identität der Objekte gleich ist (denn dies ist eine schnelle Überprüfung ist). Dies kann Widersprüche erzeugen, wenn die Logik unvereinbar ist - wie es für nan:

>>> [nan] == [nan]
True
>>> (nan,) == (nan,)
True

A Cautionary Tale:

Die Frage versucht is zu verwenden, ganze Zahlen zu vergleichen. Sie sollten nicht davon ausgehen, dass eine Instanz einer ganzen Zahl derselben Instanz wie von einem anderen Referenz erhalten wird. Diese Geschichte erklärt, warum.

hatte ein Kommentator Code, der auf der Tatsache gestützt, dass kleine ganze Zahlen (-5 bis 256 einschließlich) sind Singletons in Python, anstatt auf Gleichheit zu prüfen.

  

Wow, kann dies zu einigen heimtückische Bugs führen. Ich hatte einige Code, der überprüft, ob ein b ist, die, wie ich gearbeitet wollte, weil a und b sind in der Regel kleine Zahlen. Der Fehler geschah erst heute, nach sechs Monaten in der Produktion, weil a und b endlich groß genug waren, um nicht zwischengespeichert werden. - gwg

Es funktionierte in der Entwicklung. Es kann einige Unittests bestanden haben.

Und es funktionierte in der Produktion - bis der Code für eine ganze Zahl größer als 256 geprüft, an welcher Stelle es in der Produktion gescheitert.

Dies ist ein Produktionsfehler, der in Code-Review oder möglicherweise mit einem Stil-Checker gefangen worden sein könnte.

Lassen Sie mich betonen:. nicht is ganzen Zahlen zu vergleichen, verwenden Sie

Was ist der Unterschied zwischen is und ==?

== und is ist verschiedener Vergleich! Wie andere schon gesagt:

  • == vergleicht die Werte der Objekte.
  • is vergleicht die Referenzen der Objekte.

In Python Namen beziehen sich auf Objekte, zum Beispiel in diesem Fall value1 und value2 auf eine int Instanz bezieht den Wert 1000 Speicher:

value1 = 1000
value2 = value1

 image description hier

Da value2 bezieht sich auf das gleiche Objekt is und == geben True:

>>> value1 == value2
True
>>> value1 is value2
True

Im folgenden Beispiel werden die Namen value1 und value2 zu verschiedenen int Instanzen beziehen, auch wenn beide speichern die gleiche ganze Zahl:

>>> value1 = 1000
>>> value2 = 1000

 image description hier

Da der gleiche Wert (integer) gespeichert ist == True werden, deshalb ist es oft als „Wertvergleich“ genannt wird. Allerdings is kehrt False, da diese unterschiedliche Objekte sind:

>>> value1 == value2
True
>>> value1 is value2
False

Wann welche?

Generell is ist ein viel schneller Vergleich. Deshalb CPython Caches (oder vielleicht wieder verwendet würde den besseren Begriff sein) bestimmte Objekte wie kleine ganze Zahlen, einige Strings, etc. Aber diese sollten als Implementierungsdetail behandelt werden, könnte ( auch wenn unwahrscheinlich) Änderung an jeder Stelle ohne Vorwarnung.

Sie sollten nur verwenden is , wenn Sie:

In jeden anderen Fall, dass Sie verwenden sollen == für die Gleichstellung überprüfen.

Kann ich anpassen, das Verhalten?

Es ist ein Aspekt, dass == wurde in den anderen Antworten nicht bereits erwähnt: Es ist ein Teil von Pythons "Datenmodell" . Das bedeutet, dass sein Verhalten angepasst werden kann mit der __eq__ Methode. Zum Beispiel:

class MyClass(object):
    def __init__(self, val):
        self._value = val

    def __eq__(self, other):
        print('__eq__ method called')
        try:
            return self._value == other._value
        except AttributeError:
            raise TypeError('Cannot compare {0} to objects of type {1}'
                            .format(type(self), type(other)))

Dies ist nur ein künstliches Beispiel zu veranschaulichen, dass die Methode aufgerufen wird wirklich:

>>> MyClass(10) == MyClass(10)
__eq__ method called
True

Beachten Sie, dass standardmäßig (wenn keine andere Implementierung von __eq__ kann in der Klasse oder die Oberklassen zu finden) __eq__ verwendet is:

class AClass(object):
    def __init__(self, value):
        self._value = value

>>> a = AClass(10)
>>> b = AClass(10)
>>> a == b
False
>>> a == a

So ist es wirklich wichtig ist, __eq__ zu implementieren, wenn Sie „mehr“ wollen als nur Referenz-Vergleich für benutzerdefinierte Klassen!

Auf der anderen Seite nicht is c anpassen könnenHecks. Es wird immer vergleichen nur , wenn Sie die gleiche Referenz haben.

Werden diese Vergleiche immer eine boolean zurückgeben?

Da __eq__ kann neu implementiert oder außer Kraft gesetzt werden, ist es nicht zurückkehren True oder False beschränkt. Es könnte Rückkehr etwas (aber in den meisten Fällen sollte es eine boolean zurückgeben!).

Zum Beispiel mit NumPy Arrays der == gibt einen Array zurück:

>>> import numpy as np
>>> np.arange(10) == 2
array([False, False,  True, False, False, False, False, False, False, False], dtype=bool)

Aber is Schecks werden immer wieder zurückkehren True oder False!


1 Als Aaron Hall in den Kommentaren erwähnt:

Im Allgemeinen sollten Sie alle is True oder is False Kontrollen nicht tun, weil man in der Regel diese „Kontrollen“ in einem Kontext verwendet, die Bedingung implizit konvertiert in einen Booleschen (zum Beispiel in einer if Anweisung). Damit der is True Vergleich und die implizite boolean Besetzung macht mehr Arbeit als nur den boolean Guss tun -. Und Sie beschränken Sie sich auf booleans (die nicht als pythonic wird)

Wie PEP8 erwähnt:

  

Sie vergleichen nicht Boolesche Werte mit True False oder ==.

Yes:   if greeting:
No:    if greeting == True:
Worse: if greeting is True:

Sie sind ganz andere . is prüft Objektidentität, während == prüft auf Gleichheit (ein Begriff, der auf die beiden Operanden Typen abhängt).

Es ist nur ein glücklicher Zufall, dass „is“ richtig mit kleinen ganzen Zahlen scheint zu funktionieren (zum Beispiel 5 == 4 + 1). Das liegt daran, CPython die Speicherung von ganzen Zahlen im Bereich optimiert (-5 bis 256) von ihnen Singletons machen. Dieses Verhalten ist völlig abhängig von der Implementierung und nicht unter allen möglichen kleineren transformierende Operationen erhalten wird garantiert.

Zum Beispiel Python 3.5 macht auch kurze Strings Singletons, aber sie stört dieses Verhalten Slicing:

>>> "foo" + "bar" == "foobar"
True
>>> "foo" + "bar" is "foobar"
True
>>> "foo"[:] + "bar" == "foobar"
True
>>> "foo"[:] + "bar" is "foobar"
False

https://docs.python.org/library/stdtypes.html#comparisons

is Tests für Identität == Tests für die Gleichstellung

Jeder (small) ganzzahliger Wert wird auf einen einzigen Wert abgebildet werden, so dass alle 3 ist identisch und gleich ist. Dies ist ein Implementierungsdetail, das nicht Teil der Sprache spec obwohl

Ihre Antwort ist richtig. Der is Operator vergleicht die Identität zweier Objekte. Der == Operator vergleicht die Werte von zwei Objekten.

eines Objekts Identität ändert sich nie, wenn es erstellt wurde; Sie können als die Adresse des Objekts in Erinnerung an sie denken.

Sie können steuern, Vergleichsverhalten von Objektwerten durch eine __cmp__ Methode oder eine reich Vergleich Verfahren wie __eq__.

Der == Operator vergleicht die Werte der beiden Operanden und prüft auf Wertgleichheit. Während is Operator prüft, ob sowohl die Operanden beziehen sich auf das gleiche Objekt oder nicht.

a = [1,2,3,4]
b = a
print(a == b) # true
print(a is b) # true

Aber wenn wir das tun

b = a[:] # b now references a copy of a
print(a == b) # true
print(a is b) # false
print(a is not b) # true

Grundsätzlich is kann für id(a) == id(b) der als Abkürzung gedacht werden. Doch darüber hinaus gibt es Macken der Laufzeitumgebung, die die Dinge weiter komplizieren. Kurze Strings und kleine Zahlen zurückkehren True , wenn sie mit is verglichen, aufgrund der Python-Maschine versucht, die Verwendung von weniger Speicher für identische Objekte.

a = 'python'
b = 'python'

print(a == b) # true
print(a is b) # true

Hier finden Sie aktuelle Stack-Überlauf Frage Python „ist“ Operator unerwartet mit ganzen Zahlen verhält .

Was es meist läuft darauf hinaus, dass „is“ überprüft, ob sie das gleiche Objekt sind, nicht nur gleich zueinander sind (die Zahlen unter 256 sind ein Sonderfall).

Wie John Feminella sagte, werden Sie die meiste Zeit == und != verwenden, weil Ihr Ziel darin besteht, Werte zu vergleichen.Ich möchte nur kategorisieren, was Sie den Rest der Zeit tun würden:

Es gibt eine und nur eine Instanz von NoneType, d. h.Keiner ist ein Singleton.Folglich foo == None Und foo is None bedeutet das gleiche.Allerdings die is Der Test ist schneller und es ist die Pythonic-Konvention zu verwenden foo is None.

Wenn Sie eine Selbstbeobachtung durchführen, sich mit der Speicherbereinigung herumschlagen oder überprüfen, ob Ihr maßgeschneidertes String-Interning-Gadget funktioniert oder ähnliches, dann haben Sie wahrscheinlich einen Anwendungsfall dafür foo Ist bar.

True und False sind (jetzt) ​​auch Singletons, es gibt jedoch keinen Anwendungsfall dafür foo == True und kein Anwendungsfall dafür foo is True.

Die meisten von ihnen bereits auf den Punkt beantwortet. Nur als zusätzliche Anmerkung (basierend auf meinem Verständnis und Experimentieren, aber nicht aus einer dokumentierten Quelle), die Anweisung

  

==, wenn die genannten Ziele werden durch die Variablen gleich sind

von oben Antworten sollte als

gelesen werden
  

==, wenn die genannten Ziele werden durch die Variablen gleich sind und Objekte vom gleichen Typ / Klasse gehören,

. Ich kam zu diesem Schluss auf dem folgenden Test basiert:

list1 = [1,2,3,4]
tuple1 = (1,2,3,4)

print(list1)
print(tuple1)
print(id(list1))
print(id(tuple1))

print(list1 == tuple1)
print(list1 is tuple1)

Hier werden die Inhalte der Liste und Tupel sind gleich, aber die Art / Klasse sind unterschiedlich.

Auf den Punkt gebracht, is prüft, ob zwei Referenzen auf das gleiche Objekt oder not.== prüft, ob zwei Objekte den gleichen Wert haben oder nicht.

a=[1,2,3]
b=a        #a and b point to the same object
c=list(a)  #c points to different object 

if a==b:
    print('#')   #output:#
if a is b:
    print('##')  #output:## 
if a==c:
    print('###') #output:## 
if a is c:
    print('####') #no output as c and a point to different object 

Eigentlich wollte ich dies als einen Kommentar hinzufügen, aber konnte es nicht leicht verschönern daher als eine Antwort geben, beachten Sie bitte diese nicht als Antwort.

Das ist, was ich zu verstehen, tat -

  

Ausführen folgende nacheinander und verstehen, die Ausgabe auf jedem Schritt

a = [1,2]
b = [1,2,3]
b.pop()
id(a)
id(b)
a is b
a == b

Wie die anderen Leute in diesem Beitrag die Frage im Detail beantworten, würde ich betonen vor allem der Vergleich zwischen is und == für Strings , die zu unterschiedlichen Ergebnissen führen kann, und ich würde drängen Programmierer sie sorgfältig zu verwenden.

Für String-Vergleich, stellen Sie sicher, == statt is zu verwenden:

str = 'hello'
if (str is 'hello'):
    print ('str is hello')
if (str == 'hello'):
    print ('str == hello')

Out:

str is hello
str == hello

Aber in dem unten stehenden Beispiel == und is unterschiedliche Ergebnisse erhalten:

str = 'hello sam'
    if (str is 'hello sam'):
        print ('str is hello sam')
    if (str == 'hello sam'):
        print ('str == hello sam')

Out:

str == hello sam

Fazit:

Verwenden is sorgfältig zwischen Strings vergleichen

Python Unterschied zwischen ist und gleich (==)

  

Das ist Betreiber wie die gleichen wie der Gleichheitsoperator zu sein scheint, aber   sie sind nicht gleich.

     

Das ist überprüft, ob beide Variablen auf das gleiche Objekt zeigen, während   die == Zeichen überprüft, ob die Werte für die beiden Variablen gleich sind.

     

Also, wenn der IS-Operator gibt True zurück, dann ist die Gleichheit definitiv   Das stimmt, aber das Gegenteil kann oder kann nicht wahr sein.

Hier ist ein Beispiel die Ähnlichkeit und den Unterschied zu demonstrieren.

>>> a = b = [1,2,3]
>>> c = [1,2,3]
>>> a == b
True
>>> a == c
True
>>> a is b
True
>>> a is c
False
>>> a = [1,2,3]
>>> b = [1,2]
>>> a == b
False
>>> a is b
False
>>> del a[2]
>>> a == b
True
>>> a is b
False
Tip: Avoid using is operator for immutable types such as strings and numbers, the result is unpredictable.

"==" vergleicht Werte

"wird" vergleicht Objekte zugrunde liegen

# this pgm is to show you the diff b/n == and is

# a==b and a is b

# == compares values
# is compares references i.e compares wether two variables refer to same object(memory)

a=10
b=10
print(a==b) # returns True as a,b have same value 10 
print(a is b)
# returns True,
# we usually falsey assume that a =10 a new object . b=10 a new obj created
# but actually when b=10 ,nothing but b is pointed to 10 until value of a or b is changed from 10 

a=[1]
b=[1]
print(a==b)
#returns True as a,b have a list element 1
print(a is b)
#returns False because here two different objs are created when initiated with lists

o1 ist o2 => vergleicht, ob o1 und o2 beide auf denselben physischen Ort im Speicher zeigen (mit anderen Worten, ob sie dasselbe Objekt sind)

o1 == o2 => Hier ruft Python die Methode __cmp __(o2) von o1 auf, die idealerweise den Wert vergleicht und True oder False zurückgibt.(Mit anderen Worten, es vergleicht den Wert)

Für JAVA-Leute:

  • Um in Java zu bestimmen, ob zwei String-Variablen auf dieselbe Speicherort des physischen Speichers mithilfe von str1 == str2.(genannt Objekt Identität, und es steht in Python als str1 ist str2).

  • Um String-Werte in Java zu vergleichen, usestr1.equals(str2);In Python benutze str1 == str2.

Beispiel:

class A():
    ...:     def __init__(self,a):
    ...:         self.a = a
    ...:     def __repr__(self):
    ...:         return str(self.a)
    ...:     def __cmp__(self, value):
    ...:         print self.a
    ...:         print value.a
    ...:         return cmp(self.a, value.a)

Ausgabe der Python-Shell:

o = A(2) o1 = o

o == o1 2 2 STIMMT

o ist O1 wahr

o1 = A(2)

o ist O1 FALSCH

Wenn Sie vergleichen es mit JavaScript (jedoch nicht zu empfehlen eine Sprache gegen einen anderen zu vergleichen):

  • Verwenden Sie is für strengen Vergleich. Javascript-Äquivalent (===)
  • Verwenden Sie == für die Gleichstellung Vergleich.

Während all diese Antworten, die gegen Wertvergleich über die Umsetzung des Einwand Zeiger Vergleichs verlassen wahrscheinlich richtig sind, gibt es einen tieferen syntaktischen Grund für die Verwendung is zu bestimmen, ob ein variabler Wert ist None (in der Booleschen Logik oft als NULL dargestellt).

In relationaler Datenbank und anderen logischen Systemen impliziert NULL, dass der tatsächliche Wert „unbekannt“ ist. So ist die logische Ausdruck xx == NULL muss immer bewerten sich NULL, da es unmöglich ist, jemals zu wissen, ob xx, was Wert es haben kann, ist die gleiche wie die unbekannten Wert. In Programmiersprachen, die mehr strikt an die Regeln der Booleschen Logik, xx == NULL (oder Pythonically xx == None) haften wertet richtig NULL und alternative Mittel müssen, wenn ein variabler Wert NULL ist zu bestimmen, zur Verfügung gestellt werden. Python ist ein Ausreißer in dieser Hinsicht wegen der Einheitlichkeit der Objektreferenz auf None. Aber aus Gründen der Klarheit und logische Korrektheit, die is Vergleichsoperator mit Python scheint mir viel solidere Praxis.

Ja, es gibt Unterschied zwischen den beiden.

  • '==' : vergleicht Objekt nach Wert.
  • 'in' :. Vergleicht Objekt durch Verweis

    a = [1,2,3]  
    b = a # both pointing to same object (memory location)
    
    a == b:  
    True  
    a in b:   
    True  #because a and b are pointing to same object
    

Nun wollen wir diesen Fall betrachten:

a = [1,2,3]
b = list(a)  # creating copy of object a

a == b:  
True  # as values are same
a in b:   
False  # because they are pointing to different object.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top