Believemy logo purple

Tout savoir sur les frozenset en Python

Un frozenset permet de créer une collection de données immuables. C'est une variante du type set en Python.
Believemy logo

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 set ne 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éristiquesetfrozenset
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 :

PYTHON
# 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 ! 🥸

PYTHON
# 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.

PYTHON
fs = frozenset([1, 2, 2, 3])
print(fs)  # frozenset({1, 2, 3})

 

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.

PYTHON
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.

PYTHON
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.

PYTHON
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).

PYTHON
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).

PYTHON
permissions = {
    frozenset(['read', 'write']): 'Utilisateur standard',
    frozenset(['read', 'write', 'delete']): 'Administrateur'
}

print(permissions[frozenset(['read', 'write'])])  # Utilisateur standard

Grâ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.

PYTHON
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.

PYTHON
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èrefrozensettuple
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 :

PYTHON
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 ! 👀

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.