Obwohl diese Frage in der Praxis keinen wirklichen Nutzen hat, bin ich gespannt, wie Python das String-Interning durchführt. Ich habe folgendes bemerkt.
>>> "string" is "string"
True
Das ist wie ich erwartet hatte.
Sie können dies auch tun.
>>> "strin"+"g" is "string"
True
Und das ist ziemlich klug!
Aber das kannst du nicht machen.
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
Warum sollte Python nicht bewerten s1+"g"
und erkennen, dass es dasselbe ist s2
und auf dieselbe Adresse verweisen? Was ist eigentlich in diesem letzten Block los, damit es zurückkommt False
?
"string1" + "s2"
,10 + 3*20
usw.) bei der Kompilierung, aber Grenzen resultierenden Sequenzen zu nur 20 Elemente (zu verhindern ,[None] * 10**1000
von allzu Ihre Bytecode erweitert). Es ist diese Optimierung , die kollabiert"strin" + "g"
in"string"
; Das Ergebnis ist kürzer als 20 Zeichen.intern()
Funktion interniert .intern
Funktion in Python 3 zu finden - es wird nach sys.intern verschobenFall 1
Fall 2
Jetzt ist Ihre Frage , warum die ID gliche in Fall 1 und nicht in Fall 2.
Im Fall 1 haben Sie einen Stringliteral zugewiesen
"123"
zux
undy
.Da Zeichenfolgen unveränderlich sind, ist es für den Interpreter sinnvoll, das Zeichenfolgenliteral nur einmal zu speichern und alle Variablen auf dasselbe Objekt zu verweisen.
Daher sehen Sie die ID als identisch.
In Fall 2 ändern Sie
x
mithilfe der Verkettung. Beidex
undy
hat die gleichen Werte, aber nicht die gleiche Identität.Beide zeigen auf unterschiedliche Objekte im Speicher. Daher haben sie unterschiedliche
id
undis
Operator zurückgegebenFalse
quelle
id(x) != id(x)
Zum Beispiel, weil die Zeichenfolge während des Evaluierungsprozesses verschoben wurde.x = "12" + "3"
inx = "123"
(Verkettung von zwei Zeichenfolgenliteralen in einem einzelnen Ausdruck), sodass die Zuweisung tatsächlich die Suche durchführt und dieselbe "interne" Zeichenfolge wie für findety = "123"
.