Zwei Variablen in Python haben die gleiche id, aber keine Listen oder Tupel
Beiden Variablen in Python haben die gleichen id
:
a = 10
b = 10
a is b
>>> True
Wenn ich zwei list
s:
a = [1, 2, 3]
b = [1, 2, 3]
a is b
>>> False
laut dieser link Senderle antwortete, dass unveränderliche Objekt verweist, die gleiche id und veränderliche Objekte wie Listen haben unterschiedliche ids.
So, jetzt nach seiner Antwort, Tupel, sollten die gleichen ids - Bedeutung:
a = (1, 2, 3)
b = (1, 2, 3)
a is b
>>> False
Idealerweise als Tupel sind nicht veränderbar, sollte es wieder True
, aber es ist wieder False
!
Was ist die Erklärung?
Sie müssen unterscheiden zwischen Variablen und Objekten (Listen und Tupel) - beim vergleichen von zwei Objekten wie diesem vergleichen Sie die Speicheradressen unterscheiden sich, trotz gleicher list und tuple-Elementen.
Ich denke, Sie haben falsch verstanden, die Antwort, die Sie verknüpfen. Eindeutige unveränderliche Objekte haben unterschiedliche ids. Aber für die ganzen zahlen < 256 (bei den meisten Interpreten) den Wert vorab in den Speicher geladen und daher in Ihrem ersten Beispiel a ist b
Danke @JacquesGaudin! Es macht wenig Verständnis für mich.
Ob oder nicht diese Art der Optimierung erfolgt ist nicht garantiert. Sie sollten einfach aufhören zu denken, über diese, manchmal
Ich bin Wiedereröffnung dies, weil die dup-Gegner nicht auf die Haupt-Punkt in dieser Frage, nämlich dann, wenn Veränderlichkeit hat eine Wirkung auf Identitäten.
Ich denke, Sie haben falsch verstanden, die Antwort, die Sie verknüpfen. Eindeutige unveränderliche Objekte haben unterschiedliche ids. Aber für die ganzen zahlen < 256 (bei den meisten Interpreten) den Wert vorab in den Speicher geladen und daher in Ihrem ersten Beispiel a ist b
Danke @JacquesGaudin! Es macht wenig Verständnis für mich.
Ob oder nicht diese Art der Optimierung erfolgt ist nicht garantiert. Sie sollten einfach aufhören zu denken, über diese, manchmal
is
zurück True
und zu anderen Zeiten nicht. Wenn Sie sicher sein wollen, dass es zurück True
einfach: b = a
oder b = tuple(a)
(die tuple
Aufruf gibt eine Referenz auf das argument, wenn übergeben, der ein Tupel als parameter).Ich bin Wiedereröffnung dies, weil die dup-Gegner nicht auf die Haupt-Punkt in dieser Frage, nämlich dann, wenn Veränderlichkeit hat eine Wirkung auf Identitäten.
InformationsquelleAutor Ram Vallury | 2016-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unveränderliche Objekte haben nicht die gleichen
id
, und als mater der Tat ist dies nicht wahr, für jede Art von Objekte, definieren Sie separat. Allgemein gesprochen, jedes mal, wenn Sie ein Objekt definieren, das in Python erstellen Sie ein neues Objekt mit neuer Identität.Jedoch, im Interesse der Optimierung (meistens) es gibt einige Ausnahmen für kleine ganze zahlen (zwischen -5 und 256) und kleine Zeichenfolgen (strings interniert sind, mit einer speziellen Länge (in der Regel weniger als 20 Zeichen)), die sind singletons und haben den gleichen
id
(eigentlich ein Objekt mit mehreren Zeiger). Sie können überprüfen, diese Tatsache wie folgt:Und für ein benutzerdefiniertes Objekt:
Beachten Sie auch, dass die
is
Betreiber prüfen die Objekt-Identität, nicht der Wert. Wenn Sie überprüfen möchten, den Wert, den Sie verwenden sollten==
:Und da gibt es keine solche Regel für Tupel (andere Arten) wenn Sie definieren, die zwei gleichen Tupel in jeder Größe bekommen Sie Ihre eigenen ids:
Und beachten Sie, dass die Tatsache, singleton Ganzzahlen und strings interniert gilt auch, wenn Sie definieren, Sie in mutable und immutable Objekte:
Warum Sie denken, es sollte True zurückgeben, Sie sind 2 separate Objekte (ganze zahlen), aber mit dem gleichen Wert (nicht id). Und beachten Sie, dass Sie sind nicht weniger als 256.
ja, einverstanden. Ich denke, dass nur Ganzzahlen < 256 zurück-ids() true. jede ganze Zahl größer als 256 im python-interpreter wird mit einem eigenen id-Raum, werden die Werte gleich.
Die Tatsache, dass alle kleinen 8-bit-zahlen beziehen sich auf die gleichen Objekte im Speicher, ist eine CPython-Implementierung, detail-und sollte sich nicht darauf verlassen, aus irgendeinem Grund
Ich glaube, Sie sehen die situation aus der falschen Perspektive. Sollten Sie sich Fragen, warum es wieder
True
füra[0]
undb[0]
nicht, warum gibt esFalse
füra[1]
undb[1]
. Siehe dies bezog sich meine Antwort, wenn Sie möchten mehr details über diese.InformationsquelleAutor Kasrâmvd
Unveränderlich
!=
gleiche Objekt.*Ein unveränderliches Objekt ist einfach ein Objekt, dessen Zustand verändert werden kann; und das ist alles. , Wenn ein neues Objekt erstellt wird, eine neue Adresse zugewiesen werden, es. Als solche, zu überprüfen, ob die Adressen gleich sind mit
is
zurückFalse
.Die Tatsache, dass
1 is 1
oder"a" is "a"
zurückTrue
ist aufgrund integer-caching und string Praktikum durchgeführt von Python so lassen Sie es nicht Sie zu verwirren; es ist nicht im Zusammenhang mit den Objekten in Frage, mutable/immutable.*Leere immutable Objekte tun, auf das gleiche Objekt beziehen und Ihre
is
ness nicht true zurückgeben, dies ist eine spezielle Umsetzung bestimmten Fall.InformationsquelleAutor Jim Fasarakis Hilliard
Werfen Sie einen Blick auf diese code:
In Auftrag, um herauszufinden, warum
a is c
wird ausgewertet, wieTrue
in der Erwägung, dassa is b
ErträgeFalse
ich empfehlen Ihnen dringend, führen Sie Schritt-für-Schritt-snippet oben in der Online Python Tutor. Die grafische Darstellung der Objekte im Speicher wird Ihnen einen tieferen Einblick in dieses Thema (ich bin Befestigung ein screenshot).InformationsquelleAutor Tonechas
Check code unten..
tupils eine und b sind unter Beibehaltung Ihrer älteren Referenzen(ID) zurück, wenn wir vergeben haben, deren ältere Werte zurück. (ABER, DAS WIRD NICHT DER FALL SEIN, MIT LISTEN, WIE SIE SIND VERÄNDERLICH)
Zunächst eine und b gleiche Werte ( (1,2) ), aber Sie haben Unterschied-IDs. Nach der änderung Ihrer Werte, wenn man neu zuweisen Wert (1,2) eine und b, Sie sind jetzt verweisen, auf IHRE EIGENEN gleichen IDs (88264264 und 88283400 beziehungsweise).
**Überprüfen Sie den link Warum nicht Tupeln bekommen die gleiche ID zugewiesen, wenn Sie die gleichen Werte?
auch nach der Lektüre dieses. Ein weiterer Fall, auch hier diskutiert.
InformationsquelleAutor AKSHAY KUMAR