Sind Zeichenketten in Python zusammengefasst?

8

Hat Python einen Pool aller Zeichenketten und sind sie (Zeichenketten) Singletons?

Präziser, im folgenden Code wurden ein oder zwei Strings im Speicher erstellt:

%Vor%

?

    
Nikolay Vyahhi 25.03.2010, 21:33
quelle

3 Antworten

16

Strings sind in Python unveränderlich, so dass die Implementierung entscheiden kann, ob sie intern (das ist oft ein Begriff, der mit C # assoziiert ist, was bedeutet, dass einige Strings in einem Pool gespeichert werden) Strings oder nicht.

In Ihrem Beispiel erstellen Sie dynamisch Strings. CPython schaut nicht immer in den Pool, um zu erkennen, ob die Zeichenfolge bereits vorhanden ist - es macht auch keinen Sinn, weil Sie zuerst Speicherplatz reservieren müssen, um die Zeichenfolge zu erstellen, und dann vergleichen der Poolinhalt (ineffizient für lange Zeichenfolgen).

Aber für Strings der Länge 1 schaut CPython in den Pool (vgl. "stringobject.c"):

%Vor%

Also:

%Vor%

Wenn Sie jedoch konstante Zeichenfolgen direkt in Ihrem Code verwenden, verwendet CPython die gleiche Zeichenfolgeninstanz:

%Vor%     
AndiDog 25.03.2010, 21:40
quelle
5

Im Allgemeinen werden Zeichenketten in Python nicht interniert, aber sie scheinen manchmal zu sein:

%Vor%

Dies ist in Python nicht ungewöhnlich, wo gewöhnliche Objekte auf eine Weise optimiert werden können, die für ungewöhnliche Objekte nicht geeignet ist:

%Vor%

Und denken Sie daran, dass alle diese Arten von Details zwischen Implementierungen von Python und sogar zwischen Versionen derselben Implementierung unterschiedlich sein werden.

    
Ned Batchelder 25.03.2010 21:40
quelle
1

Strings sind im Allgemeinen nicht interniert. In Ihrem Beispiel werden zwei Strings erstellt (mit Ausnahme von Werten zwischen 0 und 9). Um dies zu testen, können wir den Operator is verwenden, um festzustellen, ob die beiden Strings das gleiche Objekt sind:

%Vor%     
Mark Byers 25.03.2010 21:35
quelle