Se hai già lavorato con i set in Python, è facile trascurare i frozenset. Sembrano quasi uguali, si comportano quasi allo stesso modo, eppure la maggior parte delle persone non li usa a meno che non abbia un motivo specifico. Quel motivo in genere si riduce a una cosa: l’immutabilità.
In Python, un frozenset è una versione immutabile e hashable di un set. Una volta creato, non puoi aggiungerci, rimuoverci o modificarlo in alcun modo. All’inizio può sembrare restrittivo. In pratica, sblocca comportamenti che i set normali semplicemente non possono supportare, soprattutto quando ti interessa la sicurezza, la prevedibilità o l’uso di collezioni come chiavi di dizionari.
Questo tutorial serve a rendere i frozenset meno astratti. Vedremo cos’è, come differisce da un set normale e quando è lo strumento giusto invece di un’alternativa oscura.
Che cos’è un frozenset in Python?
A livello di base, un frozenset è la versione immutabile di un set in Python. Come un set normale, archivia una raccolta non ordinata di elementi unici. La differenza è che, una volta creato un frozenset, il suo contenuto è bloccato. Puoi comunque verificare l’appartenenza, iterarci sopra ed effettuare operazioni insiemistiche come unioni o intersezioni. Quello che non puoi fare è modificarlo in place. Questa natura fissa è l’intero punto.
Non scegli un frozenset perché fa più di un set. Lo scegli perché fa di meno, di proposito, e questo si rivela utile in modi che un set mutabile non può eguagliare.
Frozenset vs. altre collezioni Python
Una volta capito cos’è un frozenset, la domanda più pratica è quando abbia senso rispetto agli altri tipi di collezione che Python mette a disposizione. I due confronti che contano di più nella pratica sono con set e tuple, dato che tutti e tre possono contenere più valori ma comunicano intenzioni molto diverse.
Frozenset vs. set
La differenza fondamentale tra un frozenset e un set normale è la mutabilità.
Un set è mutabile. Puoi aggiungere elementi, rimuoverli e aggiornarlo mentre il programma gira. Questa flessibilità rende i set una buona scelta per attività come raccogliere valori, filtrare dati o tracciare uno stato che cambia nel tempo.
Un frozenset è immutabile. Una volta creato, il suo contenuto è fisso. Poiché Python può fare affidamento su questa garanzia, un frozenset è hashable, mentre un set normale non lo è. Questo permette a un frozenset di essere usato come chiave di dizionario o archiviato dentro un altro set.
In pratica, la scelta di solito si riduce all’intenzione:
Usa un set quando la collezione deve cambiare.
Usa un frozenset quando la collezione rappresenta un gruppo fisso che non dovrebbe essere modificato.
Se ti ritrovi a pensare “questo set non dovrebbe mai cambiare dopo l’inizializzazione”, spesso è un segnale che il frozenset è l’opzione migliore.
Frozenset vs tuple
Sia il frozenset che la tuple sono immutabili, il che può farle sembrare intercambiabili all’inizio. La differenza sta in ciò che rappresentano.
Una tupla è ordinata e posizionale. Il significato di ogni elemento è legato alla sua posizione:
Questa distinzione è importante per la chiarezza. Se la collezione modella un raggruppamento logico di permessi, tag, categorie o flag, un frozenset di solito comunica l’intento in modo più chiaro di una tupla. Se la posizione o la sequenza contano, la tupla è la scelta migliore.
Perché l’immutabilità è importante
È qui che il frozenset inizia ad avere senso oltre la teoria. Quando un oggetto non può cambiare, il tuo modello mentale diventa più semplice. Non devi chiederti se qualche altra funzione lo abbia modificato o se il suo contenuto corrisponda ancora a ciò che ti aspetti. Una volta creato, resta valido.
Python fa grande affidamento su questa idea. Stringhe, numeri, tuple e frozenset sono tutti immutabili per lo stesso motivo: sono sicuri da riutilizzare, sicuri da condividere e sicuri da usare come chiavi di dizionari o elementi all’interno di altri set.
C’è anche un aspetto pratico di sicurezza. Nei codebase più grandi, le mutazioni accidentali sono una fonte comune di bug. Se un valore rappresenta una regola, una configurazione o un raggruppamento logico che non dovrebbe cambiare, renderlo immutabile non è solo un dettaglio di implementazione: è un segnale per chiunque legga il codice.
Questa è la nicchia che il frozenset riempie: l’espressività di un set con la prevedibilità di un oggetto immutabile.
Creare frozenset in Python
Una volta capita l’immutabilità, la domanda successiva è pratica: come crei effettivamente un frozenset nel codice reale?
Creare un frozenset da un iterabile
Il modo più comune è passare un iterabile al costruttore frozenset():
numbers =frozenset([1,2,3,3,4])print(numbers)Offerto da
Proprio come per un set normale, i duplicati vengono rimossi automaticamente.
Uno schema comune è partire da un set mutabile e poi “bloccarlo”:
allowed_roles ={"admin","editor","viewer"}
allowed_roles =frozenset(allowed_roles)Offerto da
I dati restano flessibili mentre li costruisci, poi diventano immutabili quando rappresentano una regola fissa. Da quel momento in poi, Python fa rispettare quell’intento.
Puoi anche creare direttamente un frozenset a partire da un altro set:
original ={1,2,3}
frozen =frozenset(original)Offerto da
Qui, original può ancora cambiare, ma frozen non cambierà mai.
Frozenset vuoti e tranelli comuni
Creare un frozenset vuoto trae in inganno perché Python non fornisce un letterale per esso. Questo non crea un set vuoto:
Vedere frozenset() nel codice è un segnale chiaro: questa è una collezione vuota e immutabile per scelta, non qualcosa che si intende riempire più tardi.
Cosa puoi e non puoi fare con frozenset
Qui aiuta una semplice regola pratica: le operazioni di lettura sono consentite; le operazioni che mutano non lo sono.
Operazioni supportate da frozenset
Puoi verificare l’appartenenza:
roles =frozenset({"admin","editor"})"admin"in roles # TrueOfferto da
Puoi anche eseguire le normali operazioni insiemistiche. Queste non modificano il frozenset originale; restituiscono nuove collezioni:
a =frozenset({1,2,3})
b =frozenset({3,4,5})
a | b # unione
a & b # intersezione
a - b # differenzaOfferto da
Questo è un dettaglio importante. Immutabile non significa bloccato: significa solo che l’oggetto originale resta invariato.
Operazioni non supportate
Qualsiasi cosa modifichi la collezione semplicemente non è disponibile:
roles =frozenset({"admin","editor"})
roles.add("viewer")Offerto da
Questo solleva un AttributeError. Metodi come add(), remove() e discard() non esistono affatto per i frozenset.
Quando incontri questi errori, di solito è un segnale che dovresti usare un set normale oppure che i dati andrebbero congelati più avanti nel flusso di lavoro, non prima.
Python frozenset e hashability
Qui tutto torna. Poiché un frozenset non può cambiare, Python può hasharlo in modo sicuro. Ciò significa che può essere usato dove i set normali non sono ammessi.
Usare i frozenset come chiavi di dizionari
In Python, le chiavi del dizionario devono essere hashable. Ecco perché liste e set non funzionano come chiavi:
data ={}
data[{1,2,3}]="value"# TypeErrorOfferto da
Un frozenset funziona perché il suo contenuto è fisso:
data ={}
data[frozenset({1,2,3})]="value"Offerto da
Questo schema ricorre in caching, permessi e feature flag — ovunque la chiave stessa sia una collezione. Per un approfondimento sul perché le chiavi funzionano così, il tutorial di DataCamp sui dizionari Python è un riferimento utile.
Poiché l’ordine non conta, frozenset({"read", "write"}) e frozenset({"write", "read"}) rappresentano la stessa chiave, che spesso è esattamente ciò che vuoi.
Frozenset dentro altre strutture dati
Essere hashable significa anche che un frozenset può vivere dentro altre strutture immutabili o basate su hash:
groups ={frozenset({"admin","editor"}),frozenset({"viewer"}),}
Or as part of a composite key:
key =(user_id,frozenset(user_roles))Offerto da
Questi schemi sono comuni in memoization, sistemi di configurazione e cache: contesti in cui la stabilità conta più della flessibilità.
Casi d’uso comuni per frozenset
A questo punto, il frozenset dovrebbe sembrare uno strumento deliberato, non un angolo strano di Python.
1. Rappresentare collezioni fisse
Il frozenset è una scelta naturale per collezioni che non dovrebbero mai cambiare:
permessi utente
feature flag
tipi di file supportati
stati o transizioni consentiti
ADMIN_PERMISSIONS =frozenset({"read","write","delete"})Offerto da
Usare un frozenset qui comunica chiaramente l’intento e previene mutazioni accidentali.
2. Deduplicazione e confronto
Quando l’ordine non conta, il frozenset semplifica i controlli di uguaglianza:
a =frozenset(["red","green","blue"])
b =frozenset(["blue","green","red"])
a == b # TrueOfferto da
Rende anche facile deduplicare collezioni di collezioni:
groups =[frozenset({"a","b"}),frozenset({"b","a"}),frozenset({"c"}),]
unique_groups =set(groups)Offerto da
Nessuna logica di confronto personalizzata necessaria.
Errori e idee sbagliate comuni
La maggior parte della confusione sui frozenset deriva dal trattarli come liste o dal presumere che tutte le collezioni immutabili si comportino allo stesso modo.
Aspettarsi che frozenset si comporti come una lista
Un frozenset è non ordinato. Non puoi indicizzarlo e non puoi fare affidamento sull’ordine che vedi quando lo stampi. Se ti serve accesso posizionale, stai usando la struttura sbagliata.
Se ti serve un ordinamento coerente per la visualizzazione, converti esplicitamente:
Confondere frozenset con l’immutabilità delle tuple
Tuple e frozenset sono entrambi immutabili, ma comunicano intenti diversi.
Le tuple modellano struttura e posizione.
I frozenset modellano l’appartenenza senza ordine.
Scegliere quello giusto rende il tuo codice più chiaro e meno soggetto a errori.
Conclusione
Frozenset è una parte piccola ma utile della cassetta degli attrezzi per le collezioni di Python. Ti offre la semantica di un set — elementi unici e non ordinati — aggiungendo le garanzie di immutabilità e hashability.
Questa combinazione lo rende adatto a scenari specifici: rappresentare gruppi fissi, usare collezioni come chiavi di dizionari o costruire strutture dati più sicure in codebase più grandi, dove le mutazioni accidentali possono introdurre bug. In questi casi, il frozenset è spesso più chiaro e affidabile di un set normale.
Allo stesso tempo, non è un sostituto generico. Se una collezione deve cambiare nel tempo, un set mutabile è la scelta migliore. Se l’ordine o il significato posizionale contano, una tuple è più appropriata. Il frozenset funziona al meglio quando i suoi vincoli combaciano con il problema che stai modellando.
Usato con criterio, è uno strumento semplice che rende il codice Python più prevedibile e facile da ragionare.
Technical writer specializzato in AI, ML e data science: rende idee complesse chiare e accessibili.
FAQ
A cosa serve un frozenset in Python?⌄
Il frozenset si usa quando ti serve una collezione non ordinata di elementi unici che non deve cambiare. Casi d’uso comuni includono chiavi di dizionari, valori di configurazione, insiemi di permessi e chiavi per la cache.
Si può modificare un frozenset dopo la creazione?⌄
No. Una volta creato un frozenset, non può essere modificato. Metodi come add(), remove() o discard() non sono disponibili. Qualsiasi operazione che combini o confronti frozenset restituisce invece un nuovo set o frozenset.
Perché il frozenset è hashable mentre il set no?⌄
Il frozenset è hashable perché è immutabile. Poiché il suo contenuto non può cambiare, Python può calcolare e riutilizzare in sicurezza il suo valore di hash. Un set normale è mutabile, e se fosse hashable romperebbe gli internals di dizionari o set.
Il frozenset è più veloce del set?⌄
Le prestazioni di lookup per frozenset sono simili a quelle dei set. La differenza principale non è la velocità, ma il comportamento: il frozenset scambia mutabilità con sicurezza e hashability, non con guadagni prestazionali.
Quando non dovrei usare un frozenset?⌄
Evita il frozenset quando la collezione deve cambiare nel tempo, quando l’ordine conta o quando ti serve un comportamento da lista come l’indicizzazione. In questi casi, di solito sono più adatti un set, una lista o una tupla.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Padroneggia i fondamenti dell’apprendimento per rinforzo (RL) per creare modelli in grado di muoversi in ambienti complessi del mondo reale e addestrare gli LLM.
Impara Python per lo sviluppo software, dalla scrittura di funzioni alla definizione di classi. Acquisisci le competenze necessarie per dare il via alla tua carriera da sviluppatore!
Se hai già lavorato con i set in Python, è facile trascurare i frozenset. Sembrano quasi uguali, si comportano quasi allo stesso modo, eppure la maggior parte delle persone non li usa a meno che non abbia un motivo specifico. Quel motivo in genere si riduce a una cosa: l’immutabilità.
In Python, un frozenset è una versione immutabile e hashable di un set. Una volta creato, non puoi aggiungerci, rimuoverci o modificarlo in alcun modo. All’inizio può sembrare restrittivo. In pratica, sblocca comportamenti che i set normali semplicemente non possono supportare, soprattutto quando ti interessa la sicurezza, la prevedibilità o l’uso di collezioni come chiavi di dizionari.
Questo tutorial serve a rendere i frozenset meno astratti. Vedremo cos’è, come differisce da un set normale e quando è lo strumento giusto invece di un’alternativa oscura.
Che cos’è un frozenset in Python?
A livello di base, un frozenset è la versione immutabile di un set in Python. Come un set normale, archivia una raccolta non ordinata di elementi unici. La differenza è che, una volta creato un frozenset, il suo contenuto è bloccato. Puoi comunque verificare l’appartenenza, iterarci sopra ed effettuare operazioni insiemistiche come unioni o intersezioni. Quello che non puoi fare è modificarlo in place. Questa natura fissa è l’intero punto.
Non scegli un frozenset perché fa più di un set. Lo scegli perché fa di meno, di proposito, e questo si rivela utile in modi che un set mutabile non può eguagliare.
Frozenset vs. altre collezioni Python
Una volta capito cos’è un frozenset, la domanda più pratica è quando abbia senso rispetto agli altri tipi di collezione che Python mette a disposizione. I due confronti che contano di più nella pratica sono con set e tuple, dato che tutti e tre possono contenere più valori ma comunicano intenzioni molto diverse.
Frozenset vs. set
La differenza fondamentale tra un frozenset e un set normale è la mutabilità.
Un set è mutabile. Puoi aggiungere elementi, rimuoverli e aggiornarlo mentre il programma gira. Questa flessibilità rende i set una buona scelta per attività come raccogliere valori, filtrare dati o tracciare uno stato che cambia nel tempo.
Un frozenset è immutabile. Una volta creato, il suo contenuto è fisso. Poiché Python può fare affidamento su questa garanzia, un frozenset è hashable, mentre un set normale non lo è. Questo permette a un frozenset di essere usato come chiave di dizionario o archiviato dentro un altro set.
In pratica, la scelta di solito si riduce all’intenzione:
Se ti ritrovi a pensare “questo set non dovrebbe mai cambiare dopo l’inizializzazione”, spesso è un segnale che il frozenset è l’opzione migliore.
Frozenset vs tuple
Sia il frozenset che la tuple sono immutabili, il che può farle sembrare intercambiabili all’inizio. La differenza sta in ciò che rappresentano.
Una tupla è ordinata e posizionale. Il significato di ogni elemento è legato alla sua posizione:
Qui l’ordine conta. Scambiare i valori cambierebbe il significato.
Un frozenset, al contrario, è non ordinato e basato sull’appartenenza. Rappresenta un gruppo in cui l’ordine non conta e i duplicati non sono ammessi:
Questa distinzione è importante per la chiarezza. Se la collezione modella un raggruppamento logico di permessi, tag, categorie o flag, un frozenset di solito comunica l’intento in modo più chiaro di una tupla. Se la posizione o la sequenza contano, la tupla è la scelta migliore.
Perché l’immutabilità è importante
È qui che il frozenset inizia ad avere senso oltre la teoria. Quando un oggetto non può cambiare, il tuo modello mentale diventa più semplice. Non devi chiederti se qualche altra funzione lo abbia modificato o se il suo contenuto corrisponda ancora a ciò che ti aspetti. Una volta creato, resta valido.
Python fa grande affidamento su questa idea. Stringhe, numeri, tuple e frozenset sono tutti immutabili per lo stesso motivo: sono sicuri da riutilizzare, sicuri da condividere e sicuri da usare come chiavi di dizionari o elementi all’interno di altri set.
C’è anche un aspetto pratico di sicurezza. Nei codebase più grandi, le mutazioni accidentali sono una fonte comune di bug. Se un valore rappresenta una regola, una configurazione o un raggruppamento logico che non dovrebbe cambiare, renderlo immutabile non è solo un dettaglio di implementazione: è un segnale per chiunque legga il codice.
Questa è la nicchia che il frozenset riempie: l’espressività di un set con la prevedibilità di un oggetto immutabile.
Creare frozenset in Python
Una volta capita l’immutabilità, la domanda successiva è pratica: come crei effettivamente un frozenset nel codice reale?
Creare un frozenset da un iterabile
Il modo più comune è passare un iterabile al costruttore frozenset():
Proprio come per un set normale, i duplicati vengono rimossi automaticamente.
Uno schema comune è partire da un set mutabile e poi “bloccarlo”:
I dati restano flessibili mentre li costruisci, poi diventano immutabili quando rappresentano una regola fissa. Da quel momento in poi, Python fa rispettare quell’intento.
Puoi anche creare direttamente un frozenset a partire da un altro set:
Qui, original può ancora cambiare, ma frozen non cambierà mai.
Frozenset vuoti e tranelli comuni
Creare un frozenset vuoto trae in inganno perché Python non fornisce un letterale per esso. Questo non crea un set vuoto:
Quello è un dizionario vuoto. Non esiste un equivalente {} per frozenset. L’unico modo corretto è:
Vedere frozenset() nel codice è un segnale chiaro: questa è una collezione vuota e immutabile per scelta, non qualcosa che si intende riempire più tardi.
Cosa puoi e non puoi fare con frozenset
Qui aiuta una semplice regola pratica: le operazioni di lettura sono consentite; le operazioni che mutano non lo sono.
Operazioni supportate da frozenset
Puoi verificare l’appartenenza:
Puoi anche eseguire le normali operazioni insiemistiche. Queste non modificano il frozenset originale; restituiscono nuove collezioni:
Questo è un dettaglio importante. Immutabile non significa bloccato: significa solo che l’oggetto originale resta invariato.
Operazioni non supportate
Qualsiasi cosa modifichi la collezione semplicemente non è disponibile:
Questo solleva un AttributeError. Metodi come add(), remove() e discard() non esistono affatto per i frozenset.
Quando incontri questi errori, di solito è un segnale che dovresti usare un set normale oppure che i dati andrebbero congelati più avanti nel flusso di lavoro, non prima.
Python frozenset e hashability
Qui tutto torna. Poiché un frozenset non può cambiare, Python può hasharlo in modo sicuro. Ciò significa che può essere usato dove i set normali non sono ammessi.
Usare i frozenset come chiavi di dizionari
In Python, le chiavi del dizionario devono essere hashable. Ecco perché liste e set non funzionano come chiavi:
Un frozenset funziona perché il suo contenuto è fisso:
Questo schema ricorre in caching, permessi e feature flag — ovunque la chiave stessa sia una collezione. Per un approfondimento sul perché le chiavi funzionano così, il tutorial di DataCamp sui dizionari Python è un riferimento utile.
Poiché l’ordine non conta, frozenset({"read", "write"}) e frozenset({"write", "read"}) rappresentano la stessa chiave, che spesso è esattamente ciò che vuoi.
Frozenset dentro altre strutture dati
Essere hashable significa anche che un frozenset può vivere dentro altre strutture immutabili o basate su hash:
Questi schemi sono comuni in memoization, sistemi di configurazione e cache: contesti in cui la stabilità conta più della flessibilità.
Casi d’uso comuni per frozenset
A questo punto, il frozenset dovrebbe sembrare uno strumento deliberato, non un angolo strano di Python.
1. Rappresentare collezioni fisse
Il frozenset è una scelta naturale per collezioni che non dovrebbero mai cambiare:
Usare un frozenset qui comunica chiaramente l’intento e previene mutazioni accidentali.
2. Deduplicazione e confronto
Quando l’ordine non conta, il frozenset semplifica i controlli di uguaglianza:
Rende anche facile deduplicare collezioni di collezioni:
Nessuna logica di confronto personalizzata necessaria.
Errori e idee sbagliate comuni
La maggior parte della confusione sui frozenset deriva dal trattarli come liste o dal presumere che tutte le collezioni immutabili si comportino allo stesso modo.
Aspettarsi che frozenset si comporti come una lista
Un frozenset è non ordinato. Non puoi indicizzarlo e non puoi fare affidamento sull’ordine che vedi quando lo stampi. Se ti serve accesso posizionale, stai usando la struttura sbagliata.
Se ti serve un ordinamento coerente per la visualizzazione, converti esplicitamente:
Confondere frozenset con l’immutabilità delle tuple
Tuple e frozenset sono entrambi immutabili, ma comunicano intenti diversi.
Scegliere quello giusto rende il tuo codice più chiaro e meno soggetto a errori.
Conclusione
Frozensetè una parte piccola ma utile della cassetta degli attrezzi per le collezioni di Python. Ti offre la semantica di un set — elementi unici e non ordinati — aggiungendo le garanzie di immutabilità e hashability.Questa combinazione lo rende adatto a scenari specifici: rappresentare gruppi fissi, usare collezioni come chiavi di dizionari o costruire strutture dati più sicure in codebase più grandi, dove le mutazioni accidentali possono introdurre bug. In questi casi, il frozenset è spesso più chiaro e affidabile di un set normale.
Allo stesso tempo, non è un sostituto generico. Se una collezione deve cambiare nel tempo, un set mutabile è la scelta migliore. Se l’ordine o il significato posizionale contano, una tuple è più appropriata. Il frozenset funziona al meglio quando i suoi vincoli combaciano con il problema che stai modellando.
Usato con criterio, è uno strumento semplice che rende il codice Python più prevedibile e facile da ragionare.