15.3 Unveränderliche Mengen – frozenset
Da es sich bei einem frozenset lediglich um eine Version des set handelt, die nach dem Erstellen nicht mehr verändert werden darf, wurden alle Operatoren und Methoden bereits im Rahmen der Grundfunktionalität zu Beginn des Abschnitts erklärt.
Beachten Sie jedoch, dass ein frozenset nicht wie ein set mithilfe geschweifter Klammern instanziiert werden kann. Die Instanziierung eines frozenset geschieht stets folgendermaßen:
>>> fs_leer = frozenset()
>>> fs_voll = frozenset({1,2,3,4})
>>> fs_leer
frozenset()
>>> fs_voll
frozenset({1, 2, 3, 4})
Beim Aufruf von frozenset kann ein iterierbares Objekt, beispielsweise ein set, übergeben werden, dessen Elemente in das frozenset eingetragen werden sollen.
Beachten Sie, dass ein frozenset nicht nur selbst unveränderlich ist, sondern auch nur unveränderliche Elemente enthalten darf:
>>> frozenset([1, 2, 3, 4])
frozenset({1, 2, 3, 4})
>>> frozenset([[1, 2], [3, 4]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Welche Vorteile bietet nun das explizite Behandeln einer Menge als unveränderlich? Nun, neben gewissen Vorteilen in puncto Geschwindigkeit und Speichereffizienz kommt – wir erinnern uns – als Schlüssel eines Dictionarys nur ein unveränderliches Objekt infrage.[ 57 ](Auch hier aufgrund des zu berechnenden Hash-Wertes. In Abschnitt 21.7.1 erfahren Sie, wie Sie die Hash-Berechnung für eigene Datentypen implementieren können. ) Innerhalb eines Dictionarys kann also ein frozenset sowohl als Schlüssel als auch als Wert verwendet werden. Das möchten wir im folgenden Beispiel veranschaulichen:
>>> d = {frozenset({1,2,3,4}) : "Hello World"}
>>> d
{frozenset({1, 2, 3, 4}): 'Hello World'}
Im Gegensatz dazu passiert Folgendes, wenn Sie versuchen, ein set als Schlüssel zu verwenden:
>>> d = {{1,2,3,4} : "Hello World"}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
Mit den Datentypen set und frozenset haben wir die letzten Basisdatentypen besprochen. In den nächsten Kapiteln behandeln wir weitere interessante Datentypen aus der Standardbibliothek.