63 Stimmen

Python: Warum wird ("hallo" ist "hallo") als True ausgewertet?

Warum ist "hello" is "hello" produzieren True in Python?

Ich habe Folgendes gelesen aquí :

Wenn zwei String-Literale gleich sind, wurden sie in denselben Speicherplatz abgelegt. Eine Zeichenkette ist eine unveränderliche Einheit. Es kann kein Schaden angerichtet werden.

Es gibt also nur einen einzigen Platz im Speicher für jede Python-Zeichenkette? Das klingt ziemlich seltsam. Was ist denn hier los?

95voto

carl Punkte 48262

Python (wie Java, C, C++, .NET) verwendet String-Pooling/Interning. Der Interpreter erkennt, dass "hallo" dasselbe ist wie "hallo", also optimiert er und verwendet denselben Speicherplatz.

Ein weiterer Leckerbissen: "hell" + "o" is "hello" ==> True

66voto

bobince Punkte 512550

Es gibt also nur einen einzigen Platz im Speicher für jede Python-Zeichenkette?

Nein, nur solche, bei denen der Interpreter entschieden hat, sie zu optimieren, was eine Entscheidung ist, die auf einer Richtlinie basiert, die nicht Teil der Sprachspezifikation ist und die sich in verschiedenen CPython-Versionen ändern kann.

z. B. bei meiner Installation (2.6.2 Linux):

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False

ähnlich wie bei ints:

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

Verlassen Sie sich also nicht auf "string" ist "string": Selbst wenn man sich die C-Implementierung ansieht, ist das nicht sicher.

13voto

Quantumplation Punkte 1049

Literale Zeichenketten werden wahrscheinlich auf der Grundlage ihres Hashwerts oder etwas Ähnlichem gruppiert. Zwei gleiche Zeichenketten werden im selben Speicher abgelegt, und alle Verweise beziehen sich darauf.

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------

6voto

El is Operator gibt true zurück, wenn beide Argumente dasselbe Objekt sind. Ihr Ergebnis ist eine Konsequenz hieraus und aus dem zitierten Bit.

Im Falle von String-Literalen werden diese interniert, d.h. sie werden mit bekannten Strings verglichen. Wenn eine identische Zeichenkette bereits bekannt ist, nimmt das Literal diesen Wert anstelle eines alternativen Wertes an. So werden sie zum gleichen Objekt, und der Ausdruck ist wahr.

2voto

unwind Punkte 377331

Der Python-Interpreter/Compiler analysiert die Zeichenkettenliterale, d. h. die Liste der in Anführungszeichen stehenden Zeichen. Dabei kann er erkennen, dass er diese Zeichenfolge schon einmal gesehen hat, und die gleiche Darstellung wie beim letzten Mal verwenden. Er kann dies tun, da er weiß, dass auf diese Weise definierte Zeichenketten nicht geändert werden können.

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