Learning Hub Logo

Sobre Diego Pinho

Professor especialista em tecnologia com mais de 10 anos de experiência. Autor de livros técnicos e criador de cursos que já impactaram milhares de estudantes.

Visite meu site principal →

Serviços

  • Área do Aluno
  • Consultoria Personalizada
  • Cursos Completos
  • Trabalhe Conosco

Redes Sociais

  • Youtube
  • TikTok
  • Instagram
  • LinkedIn

Links

  • Nosso Blog
  • Learning Hub
  • Cursos Online
  • Livros Publicados

Professor Diego Pinho

Educação, Tecnologia e IA © 2026

Python›Iterabilidade e imutabilidade em conjuntos

Iterabilidade e imutabilidade em conjuntos

Entendendo como conjuntos devem ser criados com valores iteráveis e imutáveis ao mesmo tempo

📚6 min de leitura

Nesta lição, vamos entender por que conjuntos precisam lidar com duas ideias ao mesmo tempo: imutabilidade e iterabilidade. Também vamos ver como elas afetam tanto a criação quanto o conteúdo de um conjunto.

Criando conjuntos com o set()

Até agora, vimos que podemos criar conjuntos usando chaves ({}). Mas o Python também permite criar um conjunto usando a função set().

No exemplo abaixo, passamos a lista frutas_lista para a função e ela transforma a lista em conjunto:

1frutas_lista = ["banana", "laranja", "maçã"] 2frutas_conjunto = set(frutas_lista) 3 4print(frutas_conjunto) 5 6# Saída possível: 7# {'banana', 'laranja', 'maçã'}

Esse padrão é muito comum quando queremos remover valores duplicados de uma lista e manter apenas os itens únicos de forma simples.

Iterabilidade e imutabilidade

Antes de continuarmos nos aprofundando, existe um ponto muito importante que costuma gerar confusão. Quando trabalhamos com a criação de conjuntos, temos duas regras diferentes que devem ser seguidas:

  1. O que pode ser passado para a função set() transformar em conjunto precisa ser um valor iterável, ou seja, deve ser possível passar pelos seus itens de um a um.

  2. O que pode existir dentro de um conjunto como seu elemento precisa ser um valor imutável, ou seja, não pode ser algo que se altera ao longo do tempo.

Vamos olhar cada uma delas separadamente e depois unir os dois conceitos para tudo fazer sentido, ok?

O que pode ser passado para set() transformar em conjunto?

Como vimos acima, o set() aceita qualquer valor que seja iterável. Esse conceito vai ficar mais claro daqui a algumas lições, mas você pode pensar nele como sendo algo que tem vários subitens e que permite que você trabalhe com esses subitens individualmente.

Em uma lista, por exemplo, você pode selecionar um valor dentro dela ou contar quantos valores ela tem. Para fazer essas e outras operações, o Python vai passando pelos itens, um a um. Isso também inclui tuplas, outros conjuntos e até mesmo as strings, já que podemos passar através dos seus caracteres.

1frutas_tupla = ("maçã", "melão", "maçã", "laranja") 2frutas_conjunto = {"uva", "abacaxi", "melancia"} 3

Repare em como as características dos conjuntos aparecem acima:

  • A tupla tinha valores repetidos, "maçã" aparecia duas vezes. O conjunto guardou apenas uma ocorrência de cada valor, restando só uma "maçã";
  • A ordem dos itens mudou. O Python reorganizou da melhor forma para trabalhá-los.

Por outro lado, você não pode passar um valor que não seja iterável, como números, valores booleanos (True e False) e o None. Esses valores causam erro porque o Python não tem como percorrê-los item por item para criar o conjunto.

1numero = 23 2booleano = True 3nada = None 4 5print(set(numero))

O que posso colocar dentro de um conjunto criado com set()?

Como vimos acima, os conjuntos trabalham garantindo unicidade dos seus itens e os organizando internamente da melhor forma pro Python usá-los.

Para isso dar certo, o Python precisa ter certeza de que cada item não vai mudar ao longo do tempo. Por isso, só é permitido guardar elementos imutáveis dentro de conjuntos.

Elementos imutáveis

Mas o que são elementos imutáveis no Python?

Para entendermos bem, precisamos separar o conceito de variável do valor que é guardado dentro dela. Pense que quando você cria a = 10, o que você realmente está criando é o valor 10. O nome a é apenas uma etiqueta para identificar o valor 10 na memória do computador.

Se depois de declarar que o valor de a é 10, você diz que a é igual a 20, pode parecer que estamos trabalhando com algo mutável. Afinal, a mudou de 10 para 20, certo? Mas na verdade, não é assim que funciona!

O número 10 continua existindo na memória do computador, ele não pode ser alterado. O que nós estamos fazendo é trocar a "etiqueta" a de lugar. Ela passa a apontar para outro valor na memória que também é imutável, o 20.

Isso fica mais claro no exemplo abaixo:

1a = 10 # "a" aponta para o valor 10 2print(a) 3 4b = a # "b" aponta para o valor que "a" está apontando, 10 5a = 20

Aqui, b continua apontando para o valor 10, mesmo depois de a ter mudado para 20. O que acontece é que a variável a simplesmente passa a apontar para outro valor, enquanto b continua ligada ao 10 original.

Em Python, os seguintes valores são imutáveis:

  • números (int, float e complex)
  • strings
  • booleanos
  • tuplas
  • None

Elementos mutáveis

Agora, vamos pensar em outro cenário. Lembra quando aprendemos sobre listas e vimos a diferença entre criar uma nova forma de chamar a mesma lista e fazer uma nova cópia de uma lista que já existe? Essa ideia vai ser bem útil aqui.

Observe:

1lista_original = [1, 2, 3] 2lista_nova = lista_original 3 4print(lista_nova) 5

Aqui, lista_nova não é uma cópia da lista_original, ela é apenas outro nome para a mesma lista na memória. Quando alteramos a lista_original, a lista_nova também muda, porque ambas apontam para o mesmo valor. Dessa forma, o dado original pode ser alterado.

Os seguintes valores são mutáveis:

  • listas
  • dicionários
  • outros conjuntos (set)

Esses valores são mutáveis e, por isso, não podem ser elementos de um conjunto.

Iteráveis E imutáveis ao mesmo tempo

Agora que entendemos as duas regras conseguimos juntar tudo!

A função set() aceita qualquer valor iterável. Isso significa que você pode enviar listas, tuplas, conjuntos e até strings. Mas, depois que o Python percorre esse iterável, ele só consegue colocar dentro do conjunto os itens que forem imutáveis.

Ou seja:

  • O valor passado para set() precisa ser iterável.
  • Cada item dentro desse valor precisa ser imutável para entrar no conjunto.

Uma lista em si é mutável, mas isso não importa porque o Python não vai guardá-la dentro do conjunto. Ele só vai usar a lista como fonte dos itens e colocar no conjunto apenas os valores imutáveis encontrados dentro dela.

Veja como isso funciona na prática:

1lista = [1, 2, 3, (4, 5), "texto"] 2conjunto = set(lista)

Dentro dela, temos:

  • os números 1, 2 e 3 → ✔️ imutáveis
  • a tupla (4, 5) → ✔️ imutável
  • a string "texto" → ✔️ imutável

Todos os itens são aceitos pelo conjunto.

Se algum dos itens fosse mutável, como uma lista interna, o Python geraria um erro ao tentar colocá-lo dentro do conjunto. Veja o que aconteceria:

1lista_interna = [3, 4] 2lista_externa = [1, 2, lista_interna] # a lista interna [3, 4] é mutável 3 4print

Aqui, o problema não está na lista_externa, ela é apenas a fonte dos itens que o Python vai copiar para dentro do nosso conjunto. O erro acontece porque um dos elementos dela, a lista_interna, é mutável, e portanto não pode ser armazenada dentro do conjunto.

Não se preocupe com o termo "unhashable" por enquanto. Esse é um conceito mais avançado que não precisamos entender a fundo agora. Basta saber que o "hash" é a forma como o Python guarda os itens dentro dos conjuntos. Ele não consegue guardar quando o item é mutável, ou seja, não é possível usar o "hash", não é "hashável" (unhashable).

← AnteriorConjuntosPróximo →Manipulando conjuntos
fruta_string
=
(
"banana"
)
4
5print(set(frutas_tupla))
6print(set(frutas_conjunto))
7print(set(fruta_string))
8
9# Saídas possíveis:
10# {'melão', 'laranja', 'maçã'}
11# {'melancia', 'uva', 'abacaxi'}
12# {'b', 'n', 'a'}
6print(set(booleano))
7print(set(nada))
8
9# Saída:
10# Traceback (most recent call last):
11# File "<stdin>", line 1, in <module>
12# print(set(numero))
13# ~~~^^^^^^^^
14# TypeError: 'int' object is not iterable
15
16# Traceback (most recent call last):
17# File "<stdin>", line 1, in <module>
18# print(set(booleano))
19# ~~~^^^^^^^^^^
20# TypeError: 'bool' object is not iterable
21
22# Traceback (most recent call last):
23# File "<stdin>", line 1, in <module>
24# print(set(nada))
25# ~~~^^^^^^
26# TypeError: 'NoneType' object is not iterable
# "a" passa a apontar para 20
6
7print(a)
8print(b)
9
10# Saída:
11# 10
12# 20
13# 10
print
(
lista original
)
6
7lista_original.append(4)
8
9print(lista_nova)
10print(lista original)
11
12#Saída
13# [1, 2, 3]
14# [1, 2, 3]
15# [1, 2, 3, 4]
16# [1, 2, 3, 4]
3
4print(conjunto)
5
6# Saída possível:
7# {1, 2, 3, (4, 5), 'texto'}
(
set
(
lista_externa
)
)
5
6# Saída:
7# Traceback (most recent call last):
8# File "<stdin>", line 1, in <module>
9# print(set(lista_externa))
10# ~~~^^^^^^^^^^^^^^^
11# TypeError: unhashable type: 'list'