2017-03-09 23 views
3
>>> a = "zzzzqqqqasdfasdf1234" 
>>> b = "zzzzqqqqasdfasdf1234" 
>>> id(a) 
4402117560 
>>> id(b) 
4402117560 

aberSind Strings zwischengespeichert?

>>> c = "[email protected]#$" 
>>> d = "[email protected]#$" 
>>> id(c) == id(d) 
False 
>>> id(a) == id(b) 
True 

Warum wenn assign string nur gleiche id() Ergebnis erhalten?

Bearbeitet: Ich ersetze "Ascii String" mit nur "String". Danke für die Rückmeldung

+4

Das sind beide ASCII-Zeichenfolgen ... – mgilson

+1

Beachten Sie auch, dass das Internieren (Caching) hier ein CPython-Implementierungsdetail ist und es auf _lots_ der Dinge ankommt. Beachten Sie, dass Sie, wenn Sie dies in ein Skript einfügen, andere Ergebnisse erhalten, als wenn Sie es in der REPL ... – mgilson

Antwort

6

Es geht nicht um ASCII vs. Nicht-ASCII (Ihr "Nicht-ASCII" ist immer noch ASCII, es ist nur Interpunktion, nicht alphanumerisch). CPython als Implementierungsdetail interns string constants that contain only "name characters". "Namenszeichen" bedeutet in diesem Fall dasselbe wie das Regex-Escape \w: Alphanumerisch, plus Unterstrich.

Hinweis: Dies kann jederzeit geändert werden, und sollte nie verlassen werden, es ist nur eine Optimierung, die sie zufällig verwenden.

Bei einer Vermutung wurde diese Wahl Code zu optimieren gemacht, die getattr und setattr verwendet, dict von einer Handvoll Stringliterale verkeilt s, etc., wobei Internierung bedeutet, dass die Wörterbuch-Lookups oft bis beteiligt endet Zeiger Vergleiche zu tun und die Vermeidung von Vergleichen der Strings überhaupt (wenn zwei Strings interniert sind, sind sie definitionsgemäß entweder das gleiche Objekt oder nicht gleich, so dass Sie vermeiden können, ihre Daten vollständig zu lesen).

+0

Vielen Dank. Kannst du mehr über "Internierungsmethoden" erklären? – ner0

+0

@ ner0: Kurzversion: Internierte Zeichenfolgen sind Zeichenfolgen in einer globalen Nachschlagetabelle, die eine eindeutige Identität für jeden Wert garantiert. Während also zwei nicht integrierte Strings den gleichen Wert haben können und dennoch völlig verschiedene Objekte sein können, kann dies nicht passieren, wenn beide Strings interniert sind, was bedeutet, dass zwei internierte Strings durch einen einfachen Zeigervergleich auf Gleichheit verglichen werden können Länge, dann Zeichen nacheinander prüfen. Python trainiert den Namen jeder Klasse, jedes Attributs, jeder Variable (obwohl sie normalerweise nicht für den lokalen Bereich verwendet wird), ihrer Funktion usw., weil der Zeiger die Geschwindigkeit überprüft. – ShadowRanger

+0

Es auto-Praktikanten (oder macht etwas sehr ähnlich) die leere Zeichenfolge und alle Länge 1 ASCII (möglicherweise Latin-1?) Zeichenfolgen, so dass sie Singletons sind, egal wie Sie sie machen, ohne sie explizit zu internieren. Auch dies ist alles Implementierungsdetail; Sie könnte sich jederzeit ändern, wenn sie die Leistung, den Speicherverbrauch, die Code-Einfachheit usw. verbessern würden. – ShadowRanger

Verwandte Themen