Ist das ein Fehler? Variablen sind identische Referenzen auf die gleiche Zeichenfolge in diesem Beispiel (Python)

8

Dies ist für Python 2.6.

Ich konnte nicht herausfinden, warum a und b identisch sind:

%Vor%

Aber wenn ein Leerzeichen in der Zeichenfolge ist, sind sie nicht:

%Vor%

Wenn dies normales Verhalten ist, könnte jemand bitte erklären, was vor sich geht.

Bearbeiten: Haftungsausschluss! Dies wird nicht zur Überprüfung auf Gleichheit verwendet. Ich wollte eigentlich jemand anderem erklären, dass "ist" nur die Identität und nicht die Gleichheit überprüft. Und aus der Dokumentation habe ich verstanden, dass auf diese Weise erstellte Referenzen anders sein werden, dass jedes Mal eine neue Zeichenfolge erstellt wird. Das allererste Beispiel, das ich gab, warf mich ab, als ich meinen eigenen Punkt nicht beweisen konnte!

Bearbeiten: Ich verstehe, dass dies nicht ein Fehler ist, und interning war ein neues Konzept für mich. Dies scheint eine gute Erklärung zu sein.

    
sarshad 12.11.2010, 14:36
quelle

3 Antworten

10

Python kann Strings automatisch internieren oder nicht, was bestimmt, ob zukünftige Instanzen des Strings eine Referenz teilen.

Wenn es beschließt, eine Zeichenfolge zu internieren, verweisen beide auf die gleiche Zeichenfolgeninstanz. Ist dies nicht der Fall, werden zwei separate Zeichenfolgen erstellt, die denselben Inhalt haben.

Im Allgemeinen müssen Sie sich keine Gedanken darüber machen, ob dies geschieht oder nicht; Normalerweise möchten Sie die Gleichheit überprüfen, a == b , nicht ob sie das gleiche Objekt sind, a is b .

    
Glenn Maynard 12.11.2010, 14:44
quelle
1

TIM PETERS SAID: Entschuldigung, der einzige Bug, den ich hier sehe, ist der Code, den Sie mit "is" gepostet haben, um zu ermitteln, ob zwei Strings gleich sind. "ist" testet auf Objektidentität, nicht auf Gleichheit, und ob zwei unveränderliche Objekte wirklich dasselbe Objekt sind, wird nicht allgemein von Python definiert. Sie sollten "==" verwenden, um zwei Zeichenfolgen auf Gleichheit zu prüfen. Die einzige Möglichkeit, "is" zu verwenden, ist dann, wenn Sie explizit alle zu vergleichenden Strings interniert haben (über die eingebaute Funktion intern).

von hier: Ссылка

    
Ant 12.11.2010 14:39
quelle
0

Das sollte eigentlich eher ein Kommentar zu Gleens Antwort sein, aber ich kann noch keine Kommentare abgeben. Ich habe einige Tests direkt auf dem Python-Interpreter ausgeführt und ich habe ein interessantes Verhalten gesehen. Laut Glenn behandelt der Interpreter Einträge als separate "Dateien" und sie teilen keine Zeichenkettentabelle, wenn sie für zukünftige Referenz gespeichert werden. Hier ist was ich laufe:

%Vor%

Es scheint, dass einige der ID-Referenzen wiederverwendet werden können, nachdem die ursprünglichen Referenzen verloren gegangen sind und nicht mehr "in Gebrauch" sind (1), aber es könnte auch mit der Zeit zusammenhängen, in der diese ID-Referenzen nicht verwendet werden kann sehen, was ich als Nummer (2) markiert habe, und verschiedene ID-Referenzen geben, abhängig davon, wie lange diese ID noch nicht benutzt wurde. Ich finde es nur neugierig und dachte daran, es zu veröffentlichen.

    
Luis Herrera 12.11.2010 16:09
quelle

Tags und Links