Ir al contenido principal

Conjunto congelado de Python: Por qué existe y cuándo lo necesitas

Descubre cómo los frozensets aportan inmutabilidad y hashability a las colecciones de Python. Aprende cuándo elegir conjuntos congelados en lugar de conjuntos normales.
Actualizado 13 ene 2026  · 7 min leer

Si ya has trabajado con conjuntos de Python anteriormente, es fácil pasar por alto frozenset. Tiene casi el mismo aspecto, se comporta casi igual y, sin embargo, la mayoría de la gente no lo utiliza a menos que tenga una razón específica para hacerlo. Esa razón suele reducirse a una sola cosa: la inmutabilidad.

En Python, un frozenset es una versión inmutable y hashable de un conjunto. Una vez creado, no podrás añadirle nada, eliminar nada ni modificarlo de ninguna manera. A primera vista, eso suena restrictivo. En la práctica, permite comportamientos que los conjuntos normales simplemente no pueden admitir, especialmente cuando te preocupas por la seguridad, la previsibilidad o el uso de colecciones como claves de diccionario.

Este tutorial trata sobre cómo hacer que frozenset resulte menos abstracto. Vamos a explicar qué es, en qué se diferencia de un conjunto normal y cuándo es la herramienta adecuada en lugar de una alternativa poco conocida.

¿Qué es un frozenset en Python?

En un nivel básico, un conjunto congelado es la versión inmutable de Python de un conjunto. Al igual que un conjunto normal, almacena una colección desordenada de elementos únicos. La diferencia es que, una vez creado un conjunto congelado, su contenido queda bloqueado. Aún puedes comprobar la pertenencia, recorrerlo y realizar operaciones de conjunto como uniones o intersecciones. Lo que tú no puedes hacer es modificarlo en el lugar. Esa naturaleza fija es el quid de la cuestión.

No recurres a frozenset porque hace más que un conjunto. Lo eliges porque hace menos, a propósito, y eso resulta ser útil de formas que un conjunto mutable no puede igualar.

Frozenset contra Otras colecciones de Python

Una vez que comprendas qué es un conjunto congelado, la pregunta más práctica es cuándo tiene sentido utilizarlo en comparación con los otros tipos de colecciones que ofrece Python. Las dos comparaciones más importantes en la práctica son las realizadas con conjuntos y tuplas, ya que los tres pueden contener múltiples valores, pero comunican intenciones muy diferentes.

Frozenset contra set

La diferencia fundamental entre un frozenset y un es es la mutabilidad.

Un conjunto es mutable. Puedes añadir elementos, eliminar elementos y actualizarlo mientras se ejecuta el programa. Esa flexibilidad hace que los conjuntos sean una buena opción para tareas como recopilar valores, filtrar datos o realizar un seguimiento del estado que cambia con el tiempo.

Un conjunto congelado es inmutable. Una vez creado, su contenido queda fijado. Dado que Python puede confiar en esa garantía, unconjunto congelado es hashable, mientras que un conjunto normal no lo es. Esto permite utilizar unconjunto congelado como clave de diccionario o almacenarlo dentro de otro conjunto.

En la práctica, la elección suele depender de la intención:

  • Utiliza un conjunto cuando la colección necesite cambiar.
  • Utiliza un frozenset cuando la colección represente un grupo fijo que no deba modificarse.

Si piensas que «este conjunto no debería cambiar nunca tras la inicialización», suele ser señal de que frozenset es la opción más adecuada.

Frozenset frente a tupla

Tanto los conjuntos congelados como las tuplas son inmutables, lo que puede hacer que, a primera vista, parezcan intercambiables. La diferencia radica en lo que representan.

Una tupla es ordenada y posicional. El significado de cada elemento está vinculado al lugar donde aparece:

point = (10, 20)

Aquí, el orden es importante. Intercambiar los valores cambiaría el significado.

Por el contrario, un conjunto congelado no está ordenado y se basa en la pertenencia. Representa un grupo en el que el orden no importa y no se permiten duplicados:

roles = frozenset({"admin", "editor"})

Esta distinción es importante para mayor claridad. Si la colección modela una agrupación lógica de permisos, etiquetas, categorías o indicadores, unconjunto congelado suele comunicar la intención con mayor claridad que una tupla. Si la posición o la secuencia son importantes, una tupla es la mejor opción.

Por qué es importante la inmutabilidad

Aquí es donde frozenset empieza a tener sentido más allá de la teoría. Cuando un objeto no puede cambiar, tu modelo mental se simplifica. No tienes que preguntarte si alguna otra función lo ha modificado o si su contenido sigue coincidiendo con lo que esperas. Una vez creado, sigue siendo válido. 

Python se basa en gran medida en esta idea. Las cadenas, los números, las tuplas y los conjuntos congelados son inmutables por la misma razón: son seguros para reutilizar, seguros para compartir y seguros para usar como claves de diccionario o elementos dentro de otros conjuntos.

También hay un aspecto práctico relacionado con la seguridad. En bases de código más grandes, las mutaciones accidentales son una fuente habitual de errores. Si un valor representa una regla, una configuración o una agrupación lógica que no debe cambiar, hacerlo inmutable no es solo un detalle de implementación, sino una señal para cualquiera que lea el código.

Ese es el nicho que ocupa frozenset: la expresividad de un conjunto con la previsibilidad de un objeto inmutable.

Creación de conjuntos congelados en Python

Una vez que se comprende la inmutabilidad, la siguiente pregunta es práctica: ¿cómo se crea realmente un conjunto congelado en código real?

Crear un conjunto congelado a partir de un iterable

La forma más habitual es pasar un iterable al constructor frozenset():

numbers = frozenset([1, 2, 3, 3, 4])
print(numbers)

Al igual que en un conjunto normal, los duplicados se eliminan automáticamente.

Un patrón común es comenzar con un conjunto mutable y luego «bloquearlo»:

allowed_roles = {"admin", "editor", "viewer"}
allowed_roles = frozenset(allowed_roles)

Los datos se mantienen flexibles mientras los creas, pero se vuelven inmutables una vez que representan una regla fija. A partir de ese momento, Python hace cumplir esa intención.

También puedes crear un conjunto congelado directamente a partir de otro conjunto:

original = {1, 2, 3}
frozen = frozenset(original)

Aquí, el original aún puede cambiar, pero el congelado nunca lo hará.

Conjuntos vacíos congelados y errores comunes

Crear un conjunto vacío hace que la gente se equivoque porque Python no proporciona un literal para ello. Esto no crea un conjunto vacío:

empty = {}

Es un diccionario vacío. No hay ningún equivalente {} para frozenset. La única forma correcta es:

empty_frozen = frozenset()

Ver frozenset() en el código es una señal clara: se trata de una colección intencionadamente vacía e inmutable, no algo que esté destinado a llenarse más adelante.

Lo que puedes y no puedes hacer con frozenset

Una regla básica sencilla te puede ayudar: las operaciones de lectura están permitidas; las operaciones que modifican datos, no.

Operaciones frozenset compatibles

Puedes comprobar tu afiliación:

roles = frozenset({"admin", "editor"})
"admin" in roles  # True

También puedes realizar operaciones estándar. Estas no modifican el conjunto congelado original, sino que devuelven nuevas colecciones:

a = frozenset({1, 2, 3})
b = frozenset({3, 4, 5})

a | b   # union
a & b   # intersection
a - b   # difference

Este es un detalle importante. La inmutabilidad no significa que estés atrapado, solo significa que el objeto original permanece sin cambios.

Operaciones no compatibles

Cualquier cosa que modifique la colección simplemente no está disponible:

roles = frozenset({"admin", "editor"})
roles.add("viewer")

Esto genera un error AttributeError. Los métodos como add(), remove() y discard() no existen en absoluto para frozenset.

Cuando se producen estos errores, suele ser una señal de que debes utilizar un conjunto normal o de que los datos deben congelarse más adelante en el flujo de trabajo, no antes.

Frozenset y hashability en Python

Aquí es donde todo cobra sentido. Dado que un conjunto congelado no puede cambiar, Python puede hasharlo de forma segura. Esto significa que se puede utilizar en lugares donde no se permiten los equipos normales.

Uso de conjuntos congelados como claves de diccionario

En Python, las claves de los diccionarios deben ser hashables. Por eso las listas y los conjuntos no funcionan como claves:

data = {}
data[{1, 2, 3}] = "value"  # TypeError

Un conjunto congelado funciona porque su contenido es fijo:

data = {}
data[frozenset({1, 2, 3})] = "value"

Este patrón aparece en el almacenamiento en caché, los permisos y los indicadores de funciones, es decir, en cualquier lugar donde la clave en sí misma sea una colección. Para comprender mejor por qué las claves funcionan así, consulta el tutorial de DataCamp sobre los diccionarios de Python es una referencia útil.

Dado que el orden no importa, frozenset({"read", "write"}) y frozenset({"write", "read"}) representan la misma clave, que suele ser exactamente lo que se desea.

Frozenset dentro de otras estructuras de datos

La capacidad de hash también significa que un conjunto congelado puede residir dentro de otras estructuras inmutables o basadas en hash:

groups = {
    frozenset({"admin", "editor"}),
    frozenset({"viewer"}),
}
Or as part of a composite key:
key = (user_id, frozenset(user_roles))

Estos patrones son comunes en la memorización, los sistemas de configuración y los lugares de almacenamiento en caché, donde la estabilidad es más importante que la flexibilidad.

Casos de uso comunes para frozenset

En este punto, frozenset debería percibirse como una herramienta deliberada y no como un rincón extraño de Python.

1. Representación de colecciones fijas

frozenset es ideal para colecciones que nunca deben cambiar:

  • permisos de usuario
  • indicadores de función
  • tipos de archivos compatibles
  • estados o transiciones permitidos
ADMIN_PERMISSIONS = frozenset({"read", "write", "delete"})

El uso de un conjunto congelado aquí comunica claramente la intención y evita mutaciones accidentales.

2. Deduplicación y comparación

Cuando el orden no importa, frozenset simplifica las comprobaciones de igualdad:

a = frozenset(["red", "green", "blue"])
b = frozenset(["blue", "green", "red"])

a == b  # True

También facilita la deduplicación de colecciones de colecciones:

groups = [
    frozenset({"a", "b"}),
    frozenset({"b", "a"}),
    frozenset({"c"}),
]
unique_groups = set(groups)

No se requiere lógica de comparación personalizada.

Errores y conceptos erróneos comunes

La mayor parte de la confusión en torno a frozenset proviene de tratarlo como una lista o de asumir que todas las colecciones inmutables se comportan de la misma manera.

Esperando que frozenset se comporte como una lista

Un conjunto congelado no está ordenado. No puedes indexarlo ni confiar en el orden que ves al imprimirlo. Si necesitas acceso posicional, estás utilizando una estructura incorrecta.

Si necesitas un orden coherente para la visualización, conviértelo explícitamente:

sorted_roles = sorted(roles)

Confusión entre frozenset y la inmutabilidad de las tuplas

Las tuplas y los conjuntos congelados son inmutables, pero transmiten intenciones diferentes.

  • Las tuplas modelan la estructura y la posición.
  • Modelos frozenset sin orden de pertenencia.

Elegir la opción adecuada hace que tu código sea más claro y menos propenso a errores.

Conclusión

Frozenset Es una parte pequeña pero útil del conjunto de herramientas de Python. Te ofrece la semántica de un conjunto (elementos únicos y sin ordenar) al tiempo que añade las garantías de inmutabilidad y hashabilidad.

Esa combinación lo hace ideal para escenarios específicos: representar grupos fijos, utilizar colecciones como claves de diccionario o crear estructuras de datos más seguras en bases de código más grandes, donde las mutaciones accidentales pueden introducir errores. En esos casos, un conjunto congelado (frozenset) de suele ser más claro y fiable que un conjunto normal.

Al mismo tiempo, no es un sustituto de uso general. Si una colección necesita cambiar con el tiempo, unconjunto mutable es la mejor opción. Si el orden o el significado posicional son importantes, es más adecuado utilizar unatupla de tipo ` `. El tipo `frozenset` funciona mejor cuando sus restricciones se ajustan al problema que estás modelando.

Utilizada de forma deliberada, es una herramienta sencilla que ayuda a que el código Python sea más predecible y fácil de entender.


Oluseye Jeremiah's photo
Author
Oluseye Jeremiah
LinkedIn

Redactor técnico especializado en IA, ML y ciencia de datos, que hace que las ideas complejas sean claras y accesibles.

Preguntas frecuentes

¿Para qué se utiliza un frozenset en Python?

frozenset se utiliza cuando necesitas una colección desordenada de elementos únicos que no deben cambiar. Entre los casos de uso más habituales se incluyen claves de diccionario, valores de configuración, conjuntos de permisos y claves de almacenamiento en caché.

¿Se puede modificar un conjunto congelado después de crearlo?

No. Una vez creado un conjunto congelado, no se puede modificar. Métodos como add(), remove() o discard() no están disponibles. Cualquier operación que combine o compare conjuntos congelados devuelve un nuevo conjunto o conjunto congelado.

¿Por qué frozenset es hashable, pero set no lo es?

frozenset es hashable porque es inmutable. Dado que su contenido no puede cambiar, Python puede calcular y reutilizar su valor hash de forma segura. Un conjunto normal es mutable, lo que rompería el diccionario o los internos del conjunto si fuera hashable.

¿Es frozenset más rápido que set?

El rendimiento de búsqueda de frozenset es similar al de set. La principal diferencia no es la velocidad, sino el comportamiento: frozenset cambia la mutabilidad por seguridad y hashability en lugar de ganancias de rendimiento.

¿Cuándo no debes utilizar un conjunto congelado?

Debes evitar frozenset cuando la colección deba cambiar con el tiempo, cuando el orden sea importante o cuando necesites un comportamiento similar al de una lista, como la indexación. En esos casos, suele ser más adecuado utilizar un conjunto, una lista o una tupla.

Temas

Aprende Python con DataCamp

programa

Desarrollador Python Asociado

32 h
Aprende Python para desarrollar software, desde escribir funciones hasta definir clases. ¡Adquiere los conocimientos necesarios para poner en marcha tu carrera de desarrollador!
Ver detallesRight Arrow
Iniciar curso
Ver másRight Arrow