Het frozenset-type is in Python geïntroduceerd als de onveranderlijke versie van het standaard set-type. Het was belangrijk om de mogelijkheid te bieden om verzamelingen te gebruiken als elementen van andere verzamelingen en als sleutels van een woordenboek (dict) — daarom was een immutable variant vereist.
De praktische vraag is — we hebben uniciteit en de mogelijkheid nodig om snel te controleren op aanwezigheid, en ook om een verzameling te gebruiken als sleutel in een woordenboek of als element van een andere verzameling. Een gewone set is niet geschikt, omdat deze veranderlijk is en daarom niet hashable.
frozenset — een onveranderlijke (immutable) verzameling. Na creatie kunnen de elementen niet worden gewijzigd: toevoegen, verwijderen of aanpassen is niet mogelijk. Maar frozenset ondersteunt alle dezelfde operaties als set, behalve de veranderlijke.
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset' object has no attribute 'add' map_dict = {fs: 'frozen'} # Toegestaan, omdat frozenset — hashable
Kan een frozenset veranderlijke objecten bevatten (bijvoorbeeld een lijst)?
Nee, alleen hashable/onveranderlijke objecten kunnen elementen van enige verzameling zijn. frozenset([[], 1]) zal een TypeError veroorzaken, net als een gewone set.
Kun je een veranderlijke set uit een frozenset halen en omgekeerd?
Beide typen kunnen in elkaar worden omgezet via de standaardconstructors:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
Ondersteunt frozenset de methoden add() of remove()?
Nee, deze methoden zijn afwezig, elke poging om ze aan te roepen zal resulteren in een AttributeError, omdat frozenset onveranderlijk is.
Gebruik van een gewone set als sleutel in een dict:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
Voordelen:
Nadelen:
Omzetting naar frozenset:
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
Voordelen:
Nadelen: