Python intern für Nicht-Strings

8

Warum ist Pythons intern nur für Strings eingebaut? Es sollte möglich sein, intern auf Klassen auszudehnen, die hashbar und vergleichbar sind, oder?

    
Neil G 03.08.2011, 22:44
quelle

3 Antworten

14

Der Zweck des Internierens von Dingen besteht darin, sie vergleichen zu können, indem man ihre Speicheradresse vergleicht; Sie stellen sicher, dass Sie niemals zwei Objekte mit demselben Wert erstellen (wenn das Programm die Erstellung eines zweiten Objekts mit demselben Wert wie ein vorhandenes Objekt anfordert, erhält es stattdessen einen Verweis auf das bereits vorhandene Objekt). Dies erfordert, dass die Dinge, die Sie internieren, unveränderlich sind; Wenn sich der Wert eines internierten Objekts ändern könnte, wird das Vergleichen nach Adresse nicht funktionieren.

In Python ist es nicht möglich, die Unveränderbarkeit von benutzerdefinierten Klasseninstanzen zu erzwingen, daher wäre es nicht sicher, sie zu internieren. Ich vermute, das ist der Hauptgrund, warum Praktikanten Klasseninstanzen nicht abdecken.

Andere eingebaute unveränderliche Typen sind entweder bereits in einer einzigen Operation auf Maschinenebene vergleichbar (int, float usw.) oder unveränderliche Container, die änderbare Werte enthalten können (Tupel, frozenset). Es besteht keine Notwendigkeit, das erstere zu internieren, und das letztere kann auch nicht sicher interniert werden.

    
Ben 04.08.2011, 06:12
quelle
1

Es gibt keinen technischen Grund dafür, dass beispielsweise ein Tupel nicht interniert werden könnte, obwohl ich mir vorstelle, dass dies in der realen Welt im Vergleich zu String-Literalen von geringem Wert ist und dass es von noch weniger reellem Wert wäre benutzerdefinierte Typen. Es funktioniert wahrscheinlich nicht als die Mühe wert.

    
kindall 03.08.2011 23:06
quelle
0

Es werden nur Zeichenfolgen unterstützt, da das Internieren auf einem zeigerbasierten Objektidentitätstest beruht. Hashes anderer Arten von Klassen können verglichen werden, aber die Objekte selbst werden niemals einem Identitätstest entsprechen. Dies ist richtig, denn obwohl sie identisch sein können, sind sie nicht die gleichen Objekte.

Referenz

    
George Cummins 03.08.2011 22:55
quelle

Tags und Links