ProgrammazioneSviluppatore Python

Quali sono le peculiarità del tipo frozenset in Python, come utilizzarlo e quando è indispensabile?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Storia della domanda

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.

Problema

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.

Soluzione

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.

Esempio di codice:

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

Caratteristiche chiave:

  • frozenset è un insieme immutabile e hashable.
  • Supporta tutti i metodi non distruttivi dei normali insiemi (unione, intersezione, differenza).
  • Può essere utilizzato come chiave in un dizionario o come elemento di un altro set.

Domande trabocchetto.

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.

Errori comuni e anti-pattern

  • Tentare di aggiungere o rimuovere un elemento da frozenset.
  • Utilizzare tipi mutabili come elementi di frozenset.
  • Aspettarsi che frozenset possa essere modificato dopo la creazione.

Esempio dalla vita reale

Caso negativo

Utilizzare un normale set come chiave in un dict:

s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'

Pro:

  • Un tentativo semplice, tipo noto — meno codice.

Contro:

  • Errore di runtime.
  • Impossibilità di realizzare il comportamento desiderato.

Caso positivo

Conversione in frozenset:

fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'

Pro:

  • Comportamento atteso, nessun errore.
  • Può partecipare come chiave, insieme di chiavi, ecc.

Contro:

  • frozenset non può essere modificato dopo la creazione, se è necessario aggiornare gli elementi — è necessario creare un nuovo oggetto.