El tipo frozenset apareció en Python como una versión inmutable del tipo estándar set. Era importante permitir el uso de conjuntos como elementos de otros sets y como claves de un dict, por lo que se necesitaba una variante inmutable.
La tarea práctica es requerir unicidad y la capacidad de verificar rápidamente la inclusión, así como usar un conjunto como clave de un diccionario o elemento de otro conjunto. Un set normal no es adecuado, ya que es mutable y, por lo tanto, no se puede hashear.
frozenset es un conjunto inmutable. Después de su creación, sus elementos no se pueden cambiar: añadir, eliminar o modificar. Pero frozenset admite todas las mismas operaciones que set, excepto las que modifican.
fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: 'frozenset' object has no attribute 'add' map_dict = {fs: 'frozen'} # Válido, ya que frozenset es hashable
¿Puede frozenset contener objetos mutables (como listas)?
No, solo los objetos hashables/inmutables pueden ser elementos de conjuntos de cualquier tipo. frozenset([[], 1]) provocará un TypeError, al igual que un set normal.
¿Se puede obtener un set mutable de frozenset y viceversa?
Ambos tipos se pueden convertir entre sí a través de los constructores estándar:
fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>
¿frozenset admite los métodos add() o remove()?
No, estos métodos están ausentes, cualquier intento de llamarlos resultará en un AttributeError, ya que frozenset es inmutable.
Uso de un set normal como clave en un dict:
s = set([1, 2]) d = {s: 'value'} # TypeError: unhashable type: 'set'
Pros:
Contras:
Conversión a frozenset:
fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'
Pros:
Contras: