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.
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.
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.
Tags und Links python language-features