Le type frozenset est apparu en Python comme la version immuable du type set standard. Il était important de permettre l'utilisation d'ensembles comme éléments d'autres sets et comme clés dans un dict — c'est pourquoi une version immuable s'est avérée nécessaire.
Le besoin pratique est d'avoir l'unicité et la capacité de vérifier rapidement l'appartenance, ainsi que d'utiliser un ensemble comme clé d'un dictionnaire ou élément d'un autre ensemble. Un set ordinaire ne convient pas, car il est mutable et donc non hachable.
frozenset — ensemble immuable. Après sa création, ses éléments ne peuvent pas être modifiés : ajoutés, supprimés ou changés. Mais frozenset prend en charge toutes les mêmes opérations que set, sauf celles qui modifient.
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: l'objet 'frozenset' n'a pas d'attribut 'add' map_dict = {fs: 'frozen'} # Acceptable, car frozenset est hachable
Un frozenset peut-il contenir des objets mutables (par exemple, une liste) ?
Non, seuls les objets hachables/immuables peuvent être des éléments d'un ensemble de n'importe quel type. frozenset([[], 1]) entraînera un TypeError, tout comme set ordinaire.
Peut-on obtenir un set mutable à partir d'un frozenset et vice versa ?
Les deux types peuvent être convertis l'un en l'autre via les constructeurs standard :
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
frozenset prend-il en charge les méthodes add() ou remove() ?
Non, ces méthodes sont absentes, toute tentative de les invoquer entraînera un AttributeError, car frozenset est immuable.
Utiliser un set ordinaire comme clé dans un dict :
s = set([1, 2]) d = {s: 'value'} # TypeError: type 'set' non hachable
Avantages :
Inconvénients :
Transformation en frozenset :
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
Avantages :
Inconvénients :