Vergleichen Sie, ob zwei Variablen in Python auf dasselbe Objekt verweisen

Antworten:

133

Dafür gibt ises: x is yGibt zurück, Trueob xund ydasselbe Objekt sind.

Jochen Ritzel
quelle
6
Im Beispiel wird x is zzurückgegeben False. Wenn jedoch x und z anstelle von Listen dieselben Werte zugewiesen werden (z. B. x, z = 13, 13), wird x is zzurückgegeben True. Warum ist das so?
Bill
12
@ Bill: Das ist ein Artefakt davon, wie Python mit Ints umgeht. Python weist Ganzzahlobjekte zu, auf die xund zzeigen. Da kleine Ganzzahlen häufig fehlerhaft sind (-1 als Fehlerwert, 0 jedes Mal, wenn Sie tatsächlich etwas indizieren, sind kleine Zahlen normalerweise vernünftige Standardwerte), optimiert Python durch Vorbelegung kleiner Zahlen (-5 bis 256) und verwendet dasselbe Ganzzahlobjekt erneut. Daher funktioniert Ihr Beispiel nur für Zahlen in diesem Bereich. Versuchen Sie, etwas Größeres zuzuweisen, z 270. Weitere Informationen finden Sie hier
am
1
@AndresR Nein das ist falsch. isprüft, ob zwei Namen auf denselben Speicherort verweisen. Es hat nichts mit dem Objekt selbst zu tun. Es ist einfach, unveränderliche Objekte wie Zeichenfolgen zu haben, die gleich sind, aber nicht am selben Ort gespeichert sind, z. B. ''a'*10000 is 'a' * 10000False.
Jochen Ritzel
1
@JochenRitzel Du hast vollkommen recht, danke für diesen Kommentar! Dann verstehe ich nicht, was passiert "af" is "af"oder () is ()... warum teilen sie sich denselben Speicherort?
AndresR
2
@AndreasR Für wörtliche Zeichenfolgen / Zahlen im Code überprüft der Compiler, ob sie nur einmal vorhanden sind, und verwendet sie erneut. Spezielle Werte wie (), None, True, False usw. werden ebenfalls als Singletons definiert. Während der Ausführung versucht die Laufzeit auch, kleine Zahlen und Zeichenfolgen wiederzuverwenden, aber am Ende ist es ein Kompromiss zwischen Geschwindigkeit und Speicher, und was passiert, hängt davon ab, wie die Python-Laufzeit implementiert wurde.
Jochen Ritzel
12

y is xwird sein True, y is zwird sein False.

Mark Rushakoff
quelle
11

Während die beiden richtigen Lösungen x is zund id(x) == id(z)bereits gebucht haben, möchte ich eine Implementierung Detail von Python hinweisen. Python speichert Ganzzahlen als Objekte. Als Optimierung generiert es zu Beginn eine Reihe kleiner Ganzzahlen (-5 bis 256) und zeigt JEDE Variable, die eine Ganzzahl mit einem kleinen Wert enthält, auf diese vorinitialisierten Objekte. Mehr Info

Dies bedeutet, dass für ganzzahlige Objekte, die mit denselben kleinen Zahlen (-5 bis 256) initialisiert wurden, die Überprüfung, ob zwei Objekte gleich sind, true zurückgibt ( ON C-Pyhon , soweit mir bekannt ist, ist dies ein Implementierungsdetail ), während für größere Objekte Zahlen, die nur dann true zurückgeben, wenn ein Objekt vom anderen initialisiert wird.

> i = 13
> j = 13
> i is j
True

> a = 280
> b = 280
> a is b
False

> a = b
> a
280
> a is b
True
ted
quelle
Python 3,6: a = 98765; b = 98765; a ist b => wahr. Anscheinend hat sich etwas geändert.
Mikhail Kalashnikov
@MikhailKalashnikov Nein. Ich habe auf Python 3.6.2 getestet, dies existiert noch.
Nix
existiert noch auf Python 3.7.7
Bill Huang
9

Sie können auch id () verwenden , um zu überprüfen, auf welches eindeutige Objekt sich jeder Variablenname bezieht.

In [1]: x1, x2 = 'foo', 'foo'

In [2]: x1 == x2
Out[2]: True

In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)

In [4]: x2 = 'foobar'[0:3]

In [5]: x2
Out[5]: 'foo'

In [6]: x1 == x2
Out[6]: True

In [7]: x1 is x2
Out[7]: False

In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)
Rechnung
quelle
Der Hinweis von @ ted zur Verwendung von id ist hier sehr relevant.
Leo Ufimtsev
2

Ich habe wirklich gerne ein visuelles Feedback, deshalb öffne ich manchmal einfach http://www.pythontutor.com/visualize.html#mode=edit, um zu sehen, wie der Speicher zugewiesen wird und worauf was verweist.

Geben Sie hier die Bildbeschreibung ein

Dieses großartige GIF wurde hinzugefügt, da es in dieser Antwort um die Visualisierung geht.

user1767754
quelle
2

Dies stammt von docs.python.org: "Jedes Objekt hat eine Identität, einen Typ und einen Wert. Die Identität eines Objekts ändert sich nach seiner Erstellung nie mehr. Sie können es sich als die Adresse des Objekts im Speicher vorstellen. Der Operator 'is' vergleicht die Identität zweier Objekte; die Funktion id () gibt eine Ganzzahl zurück, die ihre Identität darstellt. "

Anscheinend wird das Objekt jedes Mal neu erstellt, wenn Sie den Wert ändern, wie durch die Änderung der Identität angezeigt. Die Zeile x = 3 gefolgt von der Zeile x = 3.14 gibt keinen Fehler und gibt unterschiedliche Identitäten, Typen und Werte für x an.

Scott Woods
quelle
1
Ausgezeichneter Doc-Fang.
Prosti