Il tipo frozenset è stato introdotto in Python come versione immutabile del tipo set standard. Era importante garantire la possibilità di utilizzare gli insiemi come elementi di altri set e come chiavi nei dict — quindi è stata necessaria una variante immutabile.
Il compito pratico — è necessaria l'unicità e la possibilità di verificare rapidamente le appartenenze, oltre a utilizzare un insieme come chiave di un dizionario o elemento di un altro insieme. Un normale set non è adatto, poiché è mutabile e, di conseguenza, non hashable.
frozenset — insieme immutabile. Dopo la creazione, i suoi elementi non possono essere modificati: aggiunti, rimossi o cambiati. Ma frozenset supporta tutte le stesse operazioni di set, tranne quelle mutative.
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset' object has no attribute 'add' map_dict = {fs: 'frozen'} # Consentito, poiché frozenset è hashable
Può frozenset contenere oggetti mutabili (ad esempio, una lista)?
No, solo oggetti hashable/immutabili possono essere elementi di un insieme di qualsiasi tipo. frozenset([[], 1]) solleverà un TypeError, proprio come un normale set.
È possibile ottenere un set mutabile da frozenset e viceversa?
Entrambi i tipi possono essere convertiti l'uno nell'altro tramite i costruttori standard:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
frozenset supporta i metodi add() o remove()?
No, questi metodi sono assenti, qualsiasi tentativo di chiamarli porterà a un AttributeError, poiché frozenset è immutabile.
Utilizzare un normale set come chiave in un dict:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
Pro:
Contro:
Conversione in frozenset:
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
Pro:
Contro: