Programa
Se você já trabalhou com conjuntos Python antes, o frozenset é fácil de ignorar. Parece quase igual, funciona quase igual, mas mesmo assim a maioria das pessoas não o usa, a menos que tenha um motivo específico. Esse motivo geralmente se resume a uma coisa: imutabilidade.
Em Python, um frozenset é uma versão imutável e hashable de um conjunto. Depois de criá-lo, você não pode adicionar, remover ou alterar nada nele. À primeira vista, isso parece meio restritivo. Na prática, ele permite comportamentos que os conjuntos comuns simplesmente não suportam, especialmente quando você se preocupa com segurança, previsibilidade ou uso de coleções como chaves de dicionário.
Esse tutorial é pra deixar o frozenset menos abstrato. Vamos ver o que é, como é diferente de um conjunto normal e quando é a ferramenta certa, em vez de só uma alternativa meio obscura.
O que é um frozenset em Python?
Basicamente, um conjunto congelado é a versão imutável do Python de um conjunto. Como um conjunto normal, ele guarda uma coleção sem ordem de elementos únicos. A diferença é que, uma vez criado um conjunto congelado, seu conteúdo fica bloqueado. Você ainda pode verificar a adesão, percorrer o conjunto e fazer operações de conjunto, como uniões ou interseções. O que você não pode fazer é modificá-lo no local. Essa natureza fixa é o ponto principal.
Você não usa o frozenset porque ele faz mais do que um conjunto. Você o escolhe porque ele faz menos, de propósito, e isso acaba sendo útil de maneiras que um conjunto mutável não consegue igualar.
Frozenset vs. Outras coleções Python
Depois de entender o que é um conjunto congelado, a questão mais prática é quando ele faz sentido em comparação com os outros tipos de coleção que o Python oferece. As duas comparações que mais importam na prática são com conjunto e tupla, já que os três podem conter vários valores, mas comunicam intenções bem diferentes.
Frozenset vs. set
A diferença que define um conjunto congelado e um conjunto normal conjunto é a mutabilidade.
Um conjunto é mutável. Você pode adicionar elementos, remover elementos e atualizá-lo enquanto o programa está rodando. Essa flexibilidade faz com que os conjuntos sejam uma boa escolha para tarefas como coletar valores, filtrar dados ou acompanhar o estado que muda com o tempo.
Um conjunto congelado é imutável. Depois de criado, o conteúdo fica fixo. Como Python pode contar com essa garantia, um conjunto congelado frozenset é hashable, enquanto um conjunto normal não é. Isso permite que umconjunto congelado ( ) seja usado como chave de dicionário ou armazenado dentro de outro conjunto.
Na prática, a escolha geralmente depende da intenção:
- Use um conjunto quando a coleção precisar ser alterada.
- Use um frozenset quando a coleção representa um grupo fixo que não deve ser modificado.
Se você pensar: “esse conjunto nunca deve mudar depois da inicialização”, isso geralmente é um sinal de que frozenset é a melhor opção.
Frozenset vs tupla
Tanto o conjunto congelado quanto a tupla são imutáveis, o que pode fazer com que pareçam intercambiáveis à primeira vista. A diferença está no que eles representam.
Uma tupla é ordenada e posicional. O significado de cada elemento está ligado ao local onde aparece:
point = (10, 20)
Aqui, a ordem é importante. Trocar os valores mudaria o significado.
Um conjunto congelado, por outro lado, não tem ordem e é baseado em pertencimento. Representa um grupo onde a ordem não importa e duplicatas não são permitidas:
roles = frozenset({"admin", "editor"})
Essa diferença é importante pra deixar tudo mais claro. Se a coleção modelar um agrupamento lógico de permissões, tags, categorias ou sinalizadores, umconjunto congelado geralmente comunica a intenção de forma mais clara do que uma tupla. Se a posição ou a sequência são importantes, uma tupla é a melhor escolha.
Por que a imutabilidade é importante
É aqui que o frozenset começa a fazer sentido além da teoria. Quando um objeto não pode mudar, seu modelo mental fica mais simples. Você não precisa se perguntar se alguma outra função a modificou ou se o conteúdo ainda corresponde ao que você espera. Depois de criado, ele continua válido.
Python depende muito dessa ideia. Strings, números, tuplas e frozensets são todos imutáveis pelo mesmo motivo: eles são seguros para reutilizar, compartilhar e usar como chaves de dicionário ou elementos dentro de outros conjuntos.
Há também um aspecto prático relacionado à segurança. Em bases de código maiores, mutações acidentais são uma fonte comum de bugs. Se um valor representa uma regra, configuração ou agrupamento lógico que não deve mudar, torná-lo imutável não é só um detalhe de implementação, é um sinal para quem estiver lendo o código.
É esse o nicho que o frozenset preenche: a expressividade de um conjunto com a previsibilidade de um objeto imutável.
Criando conjuntos congelados em Python
Uma vez que a imutabilidade é compreendida, a próxima questão é prática: como você realmente cria um conjunto congelado em código real?
Criando um conjunto congelado a partir de um iterável
A maneira mais comum é passar um iterável para o construtor frozenset():
numbers = frozenset([1, 2, 3, 3, 4])
print(numbers)
Assim como num conjunto normal, as duplicatas são removidas automaticamente.
Um padrão comum é começar com um conjunto mutável e depois “travá-lo”:
allowed_roles = {"admin", "editor", "viewer"}
allowed_roles = frozenset(allowed_roles)
Os dados ficam flexíveis enquanto você os cria e, depois, viram imutáveis quando representam uma regra fixa. A partir daí, o Python faz valer essa intenção.
Você também pode criar um conjunto congelado diretamente a partir de outro conjunto:
original = {1, 2, 3}
frozen = frozenset(original)
Aqui, o original ainda pode mudar, mas o congelado nunca vai mudar.
Conjuntos congelados vazios e armadilhas comuns
Criar um conjunto congelado vazio confunde as pessoas porque o Python não tem um literal pra isso. Isso não cria um conjunto vazio:
empty = {}
Isso é um dicionário vazio. Não tem nada igual ao frozenset. A única maneira certa é:
empty_frozen = frozenset()
Ver frozenset() no código é um sinal claro: essa é uma coleção intencionalmente vazia e imutável, não algo que deve ser preenchido posteriormente.
O que você pode e não pode fazer com o conjunto congelado
Uma regra simples ajuda aqui: operações que leem são permitidas; operações que alteram não são.
Operações frozenset suportadas
Você pode conferir a adesão:
roles = frozenset({"admin", "editor"})
"admin" in roles # True
Você também pode fazer operações padrão. Isso não mexe no conjunto congelado original; eles devolvem novas coleções:
a = frozenset({1, 2, 3})
b = frozenset({3, 4, 5})
a | b # union
a & b # intersection
a - b # difference
Esse é um detalhe importante. Imutabilidade não quer dizer que você está preso, só quer dizer que o objeto original continua igual.
Operações não suportadas
Qualquer coisa que possa alterar a coleção simplesmente não está disponível:
roles = frozenset({"admin", "editor"})
roles.add("viewer")
Isso gera um erro AttributeError. Métodos como add(), remove() e discard() não existem para frozenset.
Quando você se depara com esses erros, geralmente é um sinal de que você deve usar um conjunto regular ou que os dados devem ser congelados mais tarde no fluxo de trabalho, e não antes.
Frozenset e Hashability em Python
É aqui que tudo se junta. Como um conjunto congelado não pode ser alterado, o Python pode fazer o hash dele com segurança. Isso quer dizer que dá pra usar em lugares onde os conjuntos normais não são permitidos.
Usando conjuntos congelados como chaves de dicionário
Em Python, as chaves do dicionário precisam ser hashable. É por isso que listas e conjuntos não funcionam como chaves:
data = {}
data[{1, 2, 3}] = "value" # TypeError
Um conjunto congelado funciona porque seu conteúdo é fixo:
data = {}
data[frozenset({1, 2, 3})] = "value"
Esse padrão aparece no cache, nas permissões e nos sinalizadores de recursos — em qualquer lugar onde a chave em si é uma coleção. Pra entender melhor por que as chaves funcionam assim, dá uma olhada no tutorial do DataCamp sobre dicionários Python é uma referência útil.
Como a ordem não importa, frozenset({"read", "write"}) e frozenset({"write", "read"}) representam a mesma chave, o que muitas vezes é exatamente o que você quer.
Frozenset dentro de outras estruturas de dados
Hashability também quer dizer que um conjunto congelado pode ficar dentro de outras estruturas imutáveis ou baseadas em hash:
groups = {
frozenset({"admin", "editor"}),
frozenset({"viewer"}),
}
Or as part of a composite key:
key = (user_id, frozenset(user_roles))
Esses padrões são comuns em memoização, sistemas de configuração e locais de cache, onde a estabilidade é mais importante do que a flexibilidade.
Casos de uso comuns para frozenset
Neste ponto, o frozenset deve parecer uma ferramenta bem pensada, em vez de um canto estranho do Python.
1. Representando coleções fixas
O frozenset é ideal para coleções que nunca devem mudar:
- permissões do usuário
- sinalizadores de recurso
- tipos de arquivos compatíveis
- estados ou transições permitidos
ADMIN_PERMISSIONS = frozenset({"read", "write", "delete"})
Usar um conjunto congelado aqui deixa a intenção bem clara e evita mudanças acidentais.
2. Desduplicação e comparação
Quando a ordem não importa, o frozenset simplifica as verificações de igualdade:
a = frozenset(["red", "green", "blue"])
b = frozenset(["blue", "green", "red"])
a == b # True
Isso também facilita a deduplicação de coleções de coleções:
groups = [
frozenset({"a", "b"}),
frozenset({"b", "a"}),
frozenset({"c"}),
]
unique_groups = set(groups)
Não precisa de nenhuma lógica de comparação personalizada.
Erros comuns e equívocos
A maior parte da confusão em torno do frozenset vem de tratá-lo como uma lista ou achar que todas as coleções imutáveis funcionam da mesma maneira.
Esperando que o frozenset se comporte como uma lista
Um conjunto congelado não tem ordem. Você não pode indexá-lo e não pode confiar na ordem que vê ao imprimi-lo. Se você precisa de acesso posicional, está usando a estrutura errada.
Se você precisar de uma ordem consistente para exibição, converta explicitamente:
sorted_roles = sorted(roles)
Confundindo frozenset com imutabilidade de tupla
Tuplas e conjuntos congelados são imutáveis, mas comunicam intenções diferentes.
- Tuplas modelam estrutura e posição.
- modelos congelados sem ordem.
Escolher a opção certa deixa seu código mais claro e menos propenso a erros.
Conclusão
Frozenset é uma parte pequena, mas útil, do kit de ferramentas de coleção do Python. Ele oferece a semântica de um conjunto — elementos únicos e não ordenados —, além de garantir imutabilidade e capacidade de hash.
Essa combinação torna-o adequado para cenários específicos: representar grupos fixos, usar coleções como chaves de dicionário ou construir estruturas de dados mais seguras em bases de código maiores, onde mutações acidentais podem introduzir bugs. Nesses casos, um conjunto congelado (frozenset) costuma ser mais claro e confiável do que um conjunto normal.
Ao mesmo tempo, não é um substituto para tudo. Se uma coleção precisa mudar com o tempo, um conjunto mutável set é a melhor escolha. Se a ordem ou o significado posicional forem importantes, umtuplo é mais adequado. O frozenset funciona melhor quando suas restrições combinam com o problema que você está modelando.
Usada de propósito, é uma ferramenta simples que ajuda a tornar o código Python mais previsível e fácil de entender.
Escritor técnico especializado em IA, ML e ciência de dados, tornando ideias complexas claras e acessíveis.
Perguntas frequentes
Pra que serve um frozenset no Python?
O frozenset é usado quando você precisa de uma coleção não ordenada de elementos únicos que não devem mudar. Os casos de uso mais comuns incluem chaves de dicionário, valores de configuração, conjuntos de permissões e chaves de cache.
Dá pra mexer num conjunto congelado depois de criado?
Não. Depois que um conjunto congelado é criado, ele não pode ser modificado. Métodos como add(), remove() ou discard() não estão disponíveis. Qualquer operação que combine ou compare conjuntos congelados retorna um novo conjunto ou conjunto congelado.
Por que o frozenset é hashable, mas o set não é?
O frozenset é hashable porque é imutável. Como o conteúdo não pode mudar, o Python pode calcular e reutilizar o valor hash com segurança. Um conjunto regular é mutável, o que poderia danificar o dicionário ou o conjunto interno se fosse hashable.
O frozenset é mais rápido que o set?
O desempenho da pesquisa para frozenset é parecido com odo conjunto. A principal diferença não é a velocidade, mas o comportamento: frozenset troca mutabilidade por segurança e hashability em vez de ganhos de desempenho.
Quando eu não devo usar um conjunto congelado?
Você deve evitar o frozenset quando a coleção precisa mudar com o tempo, quando a ordem é importante ou quando você precisa de um comportamento semelhante a uma lista, como indexação. Nesses casos, um conjunto, lista ou tupla geralmente é mais apropriado.
