39 Stimmen

Ergebnis des Operators "is": Was passiert gerade?

Ich war ziemlich überrascht, als

[] is not []

bewertet nach True .

Was geschieht in diesem Code? Was wirklich not y is Aussagen machen?

60voto

Mark Byers Punkte 761508

a is not b ist ein spezieller Operator, der gleichbedeutend ist mit not a is b .

Der Betreiber a is b gibt True zurück, wenn a und b an das gleiche Objekt gebunden sind, andernfalls False. Wenn Sie zwei leere Listen erstellen, erhalten Sie zwei verschiedene Objekte, also is gibt False zurück (und damit is not gibt True zurück).

8 Stimmen

wenn a und b das gleiche Objekt sind - Ich würde gerne an das gleiche Objekt gebunden sind noch besser.

36voto

unholysampler Punkte 16647

is ist der Identitätsvergleich.

== ist der Gleichheitsvergleich.

Ihre Aussage besteht darin, zwei verschiedene Listen zu erstellen und zu prüfen, ob es sich um dieselbe Instanz handelt, was nicht der Fall ist. Wenn Sie == wird true zurückgegeben, da es sich bei beiden um leere Listen handelt.

25voto

Jiaaro Punkte 70598

Der beste Weg, um zu beschreiben, WARUM das geschieht, ist folgender:

Hier ist Ihr Beispiel

>>> x = []
>>> y = []
>>> print(x is y)
... False

x y y sind eigentlich zwei verschiedene Listen, wenn Sie also etwas zu x erscheint sie nicht in y

>>> x.append(1)
>>> print(x)
... [1]
>>> print(y)
... []

Wie können wir also ( x is y ) als wahr bewerten?

>>> x = []
>>> y = x
>>> print(x is y)
... True

>>> x.append(10)

>>> print(x)
... [10]
>>> print(y)
... [10]

>>> print(x is y)
... True

wenn Sie sehen wollen, ob zwei Listen den gleichen Inhalt haben...

>>> x = []
>>> y = []
>>> print(x == y)
... True

>>> x.append(21)

>>> print(x)
... [21]
>>> print(y)
... []

>>> print(x == y)
... False

>>> y = [21]
>>> print(x == y)
... True

1 Stimmen

Ausgezeichnete Antwort, aber nach dem Lesen este in der Python-Referenz, bin ich verwirrt: Aufgrund der automatischen Müllsammlung, freier Listen und der dynamischen Natur von Deskriptoren, können Sie bei bestimmten Verwendungen des is-Operators ein scheinbar ungewöhnliches Verhalten feststellen wie Vergleiche zwischen Instanzmethoden oder Konstanten.

0 Stimmen

" wenn man also etwas zu x hinzufügt, erscheint es nicht in y" - das erscheint mir falsch. Versuchen Sie a="test";b="test";a is b . Es wird Ihnen True auch wenn die Änderung des einen nicht die Änderung des anderen zur Folge hat.

5 Stimmen

@Pithikos, das liegt an einer Optimierung in der speziellen Python-Version, die Sie verwenden, es ist keine Garantie. Außerdem sind Strings unveränderlich, sodass Sie einen dieser Werte nicht ändern können.

8voto

Sjoerd Punkte 71416

is bedeutet ist dieselbe Instanz . Er wird als wahr ausgewertet, wenn die Variablen auf beiden Seiten des Operators auf dasselbe Objekt zeigen, andernfalls als falsch.

Référence in der Nähe des unteren Randes.

3voto

Wayne Werner Punkte 45176

Wird auf Identität geprüft. [] y [] sind zwei verschiedene (aber gleichwertige) Listen. Wenn Sie prüfen möchten, ob beide Listen leer sind, können Sie deren Wahrheitswert verwenden (false für leere Zeichenketten, Sammlungen und Nullen).

if not ([] and []):
   print 'Spanish Inquisition'

das einzige Mal, dass is garantiert, dass sie True zurückgibt, ist für Singletons wie None. Wie beim Highlander kann es nur eine Instanz von None in Ihrem Programm geben - jedes Mal, wenn Sie None zurückgeben, ist es genau dasselbe "Ding" wie das None, auf das Sie sich beziehen, wenn Sie print None .

[], OTOH, ist nicht garantiert, etwas anderes als eine leere Liste zu sein und zu False in einem booleschen Kontext auszuwerten.

0 Stimmen

a = b . Ich glaube, dass wir jetzt garantiert sind, dass a is b .

0 Stimmen

@recursive, wissen Sie, ob das auch bei Strings/Zahlen der Fall ist?

0 Stimmen

Soweit ich weiß, gilt das für alles. Wenn Sie zuweisen b à a in Python ordnen Sie a ein Verweis auf das Objekt sein, auf das derzeit durch b . Ihre Identität wird also identisch sein. Es ist Python, so kann es möglich sein, einige seltsame Dinge wie überschreiben Zuordnung zu tun, um dies zu brechen, aber im Allgemeinen würde ich sagen, ja.

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