Un frozenset est une variante immuable du type set en Python.
Cela signifie qu’une fois créé, on ne peut plus le modifier : il est impossible d’y ajouter ou retirer des éléments.
En bref : un frozenset est un set "gelé" (frozen 🇺🇸) ! Parfait pour garantir l'intégrité d’un ensemble de valeurs.
Concrètement, on peut imaginer utiliser un frozenset dans ces scénarios :
- Pour protéger un ensemble de données contre toute modification accidentelle ;
- Pour utiliser un ensemble comme clé dans un dictionnaire, ce que
setne permet pas ; - Pour bénéficier d’un type hashable, pratique dans les contextes avancés.
Différences entre set et frozenset
Tableau comparatif
Voici les principales différences entre un set et un frozenset :
| Caractéristique | set | frozenset |
| Modifiable ? | ✅ Oui | ❌ Non |
| Hashable ? | ❌ Non | ✅ Oui |
| Propose une clé de dictionnaire ? | ❌ Non | ✅ Oui |
| Ajout / suppression ? | ✅ Oui (add, remove, pop, etc) | ❌ Non |
Exemple comparatif
D'un point de vue code, voici ce que ça donne :
# Set
s = {1, 2, 3}
s.add(4) # ✅ OK
# Frozenset
fs = frozenset([1, 2, 3])
fs.add(4) # ❌ Erreur : 'frozenset' object has no attribute 'add'Utiliser frozenset permet bien d’éviter des modifications involontaires du jeu de données, en particulier dans les projets complexes où plusieurs fonctions partagent un même objet. 😉
Créer un frozenset
Le mot-clé pour créer un ensemble immuable est simplement : frozenset(). Facile ! 🥸
# Depuis une liste
fs1 = frozenset([1, 2, 3])
# Depuis un set
s = {4, 5}
fs2 = frozenset(s)
# Depuis une string
fs3 = frozenset("abc") # {'a', 'b', 'c'}Un frozenset élimine aussi les doublons, comme un set classique.
Les opérations sur un frozenset
Même si un frozenset est immuable, il accepte toutes les opérations ensemblistes classiques.
Union (avec "|")
Une union permet de réunir tous les éléments d'un frozenset A et d'un second frozenset B.
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a | b) # frozenset({1, 2, 3})Notons que le "2" a été supprimé car il était en double : nous n'en avons gardé qu'un seul, grâce à l'unicité propre aux sets (donc aux frozensets).
Intersection (avec "&")
Une intersection permet de récupérer uniquement les éléments qui sont à la fois dans le frozenset A et dans le frozenset B.
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a & b) # frozenset({2})
Différence (avec "-")
Une différence donne les éléments qui sont dans le frozesent A et pas dans le frozenset B.
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a - b) # frozenset({1})
Différence symétrique (avec "^")
Une différence symétrique donne les éléments dans le frozensent A qui ne sont pas dans le frozenset B et inversement (contrairement à une simple différence).
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a ^ b) # frozenset({1, 3})
Le frozenset comme clé dans un dictionnaire
L’une des principales raisons d’utiliser un frozenset, c’est qu’il est hashable, ce qui permet de l’utiliser comme clé dans un dictionnaire (chose impossible avec un set classique).
permissions = {
frozenset(['read', 'write']): 'Utilisateur standard',
frozenset(['read', 'write', 'delete']): 'Administrateur'
}
print(permissions[frozenset(['read', 'write'])]) # Utilisateur standardGrâce à cette propriété, le frozenset devient très utile dans les cas où vous souhaitez associer des ensembles de permissions, de tags ou de propriétés à une valeur spécifique.
Utilisation dans des ensembles de sets
Puisqu’un set ne peut contenir que des objets hashables, il ne peut pas contenir un autre set. En revanche, il peut parfaitement contenir un frozenset.
a = frozenset([1, 2])
b = frozenset([2, 3])
ensemble_de_sets = {a, b}
print(ensemble_de_sets)Tout ceci ouvre la porte à des cas d’usage avancés :
- Comparaison de grappes de données (clustering) ;
- Analyse de graphes ou de réseaux ;
- Validation de configurations immuables.
Si vous avez besoin d’un ensemble d’ensembles, frozenset est votre seul allié en Python natif.
Le typage avec frozenset
Python propose une annotation de type spécifique pour frozenset via le module typing.
from typing import FrozenSet
def traiter_permissions(permissions: FrozenSet[str]) -> None:
print("Permissions reçues :", permissions)Ce typage permet de mieux documenter votre code tout en le rendant compatible avec des outils de vérification statique comme mypy ou pyright.
Comparaison entre frozenset et tuple
Une autre comparaison assez souvente faite avec frozenset est avec tuple.
| Critère | frozenset | tuple |
| Ordonné ? | ❌ Non | ✅ Oui |
| Doublons autorisés ? | ❌ Non | ✅ Oui |
| Accès par index ? | ❌ Non | ✅ Oui |
| Opérations ensemblistes ? | ✅ Oui | ❌ Non |
De manière générale, tuple est plus adapté pour des données positionnelles, tandis que frozenset est idéal pour des ensembles de propriétés uniques.
Questions fréquentes sur frozenset
Peut-on trier un frozenset ?
Non, mais on peut le convertir :
trie = sorted(frozenset([3, 1, 2])) # [1, 2, 3]
Pourquoi ne pas toujours utiliser frozenset ?
Parce qu’il est moins flexible. Si vous devez modifier l’ensemble, préférez set.
Comment apprendre Python ?
Avec une super formation Python ! 👀