628 Stimmen

Gibt es einen Unterschied zwischen "==" und "ist"?

Meine Google-fu hat mich im Stich gelassen.

Sind die beiden folgenden Gleichheitstests in Python gleichwertig?

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

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

Gilt dies auch für Objekte, bei denen Sie Instanzen vergleichen würden (eine 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 == Testwert, bei dem is Tests, um festzustellen, ob es sich um dasselbe Objekt handelt?

5voto

suvojit_007 Punkte 1660

Kurz und bündig, is prüft, ob zwei Referenzen auf dasselbe Objekt zeigen oder nicht. == 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

3voto

John Machin Punkte 78125

Wie John Feminella schon sagte, werden Sie in den meisten Fällen == und != verwenden, da Ihr Ziel darin besteht, Werte zu vergleichen. Ich möchte nur kategorisieren, was Sie den Rest der Zeit tun würden:

Es gibt nur eine einzige Instanz von NoneType, d. h. None ist ein Singleton. Folglich foo == None y foo is None dasselbe bedeuten. Allerdings ist die is Test ist schneller und die Pythonic-Konvention ist es, die foo is None .

Wenn Sie eine Introspektion durchführen oder mit der Garbage Collection herumspielen oder überprüfen, ob Ihr selbstgebautes String-Interning-Gadget funktioniert oder ähnliches, dann haben Sie wahrscheinlich einen Anwendungsfall für foo es bar .

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

3voto

Sandeep Punkte 1187

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

\== wenn die Objekte, auf die sich die Variablen beziehen, gleich sind

aus den obigen Antworten sind zu lesen als

\== wenn die Objekte, auf die sich die Variablen beziehen, gleich sind und Objekte desselben Typs/derselben Klasse sind

. Ich bin zu diesem Schluss gekommen, indem ich den folgenden Test durchgeführt habe:

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 sind der Inhalt der Liste und des Tupels gleich, aber der Typ/die Klasse sind unterschiedlich.

3voto

Projesh Bhoumik Punkte 1008

Python Unterschied zwischen is und equals(==)

Der is-Operator scheint dasselbe zu sein wie der Gleichheitsoperator, aber sie sind nicht dasselbe.

Die ist prüft, ob beide Variablen auf dasselbe Objekt zeigen, während das Zeichen == prüft, ob die Werte der beiden Variablen gleich sind.

Wenn also der is-Operator True zurückgibt, ist die Gleichheit definitiv wahr, aber das Gegenteil kann wahr sein oder auch nicht.

Hier ein Beispiel, um die Ähnlichkeit und den Unterschied zu verdeutlichen.

>>> 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X