Typ frozenset powstał w Pythonie jako niezmienna wersja standardowego typu set. Ważne było zapewnienie możliwości używania zbiorów jako elementów innych zbiorów i kluczy słownika — dlatego potrzebna była wersja niemutowalna.
Praktyczne zadanie — potrzebna jest unikalność i możliwość szybkiej weryfikacji przynależności, a także użycie zbioru jako klucza w słowniku lub elementu innego zbioru. Zwykły set nie nadaje się, ponieważ jest mutowalny i, odpowiednio, niehaszowalny.
frozenset — niezmienne (immutable) zbioru. Po utworzeniu jego elementów nie można zmieniać: dodawać, usuwać ani modyfikować. Ale frozenset obsługuje wszystkie te same operacje, co set, oprócz zmieniających.
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset' object has no attribute 'add' map_dict = {fs: 'frozen'} # Dozwolone, ponieważ frozenset — hashable
Czy frozenset może zawierać obiekty mutowalne (na przykład listy)?
Nie, tylko obiekty haszowalne/niezmienne mogą być elementami zbioru dowolnego typu. frozenset([[], 1]) spowoduje TypeError, podobnie jak zwykły set.
Czy można uzyskać zmienny set z frozenset i odwrotnie?
Oba typy można konwertować między sobą za pomocą standardowych konstruktorów:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
Czy frozenset obsługuje metody add() lub remove()?
Nie, te metody nie istnieją, każda próba ich wywołania spowoduje AttributeError, ponieważ frozenset jest niezmienny.
Użycie zwykłego set jako klucza w słowniku:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
Plusy:
Minusy:
Konwersja na frozenset:
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
Plusy:
Minusy: