Ich war ziemlich überrascht, als
[] is not []
bewertet nach True
.
Was geschieht in diesem Code? Was wirklich not
y is
Aussagen machen?
Ich war ziemlich überrascht, als
[] is not []
bewertet nach True
.
Was geschieht in diesem Code? Was wirklich not
y is
Aussagen machen?
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).
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
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.
" 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.
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.
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 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.