Atribuir Múltiplos Valores
Aprenda a atribuir múltiplos valores em Python: desempacotamento de tuplas, um valor para várias variáveis, atribuição com asterisco e erros comuns.
Atribuir Múltiplos Valores em Python
Python permite atribuir valores a várias variáveis em uma única instrução. Este capítulo aborda quatro padrões comuns que você encontrará em código real:
- Atribuição múltipla — diferentes valores para diferentes variáveis em uma linha.
- Atribuição encadeada — o mesmo valor para várias variáveis ao mesmo tempo.
- Desempacotamento de iterável — extrair itens de uma lista, tupla ou qualquer iterável.
- Atribuição com asterisco — coletar um "restante" de tamanho variável em uma lista.
Cada padrão é explicado abaixo com exemplos executáveis e os erros a observar.
Atribuição Múltipla (Desempacotamento de Tupla)
A forma mais comum usa uma lista de nomes separados por vírgulas à esquerda e uma lista correspondente de valores à direita:
variable1, variable2, variable3 = value1, value2, value3Python empacota o lado direito em uma tupla temporária e, em seguida, desempacota nos nomes à esquerda, da esquerda para a direita. O número de nomes e valores deve ser exatamente igual; caso contrário, Python lança um ValueError.
Atribuindo três variáveis de tipos diferentes em uma linha:
Saída:
Python
3.7
TrueIsso equivale a escrever três instruções de atribuição separadas, mas é mais conciso e torna a relação entre os nomes evidente de imediato.
Trocando Variáveis
Como Python avalia todo o lado direito antes de qualquer atribuição ocorrer, você pode trocar duas variáveis sem usar uma variável temporária:
x = 5
y = 10
# Before swapping
print("Before swapping")
print("x =", x)
print("y =", y)
# Swap in one line — no temp variable needed
x, y = y, x
# After swapping
print("After swapping")
print("x =", x)
print("y =", y)Saída:
Before swapping
x = 5
y = 10
After swapping
x = 10
y = 5Na maioria das outras linguagens, essa troca exige uma terceira variável temporária. A semântica de empacotamento de tuplas do Python torna a solução em uma linha segura.
ValueError: Incompatibilidade de Quantidade
Se o número de valores não corresponder ao número de nomes, Python lança um ValueError imediatamente:
a, b = 1, 2, 3 # too many values
# ValueError: too many values to unpack (expected 2)
a, b, c = 1, 2 # too few values
# ValueError: not enough values to unpack (expected 3, got 2)Ao ver esse erro, conte os nomes à esquerda e os valores à direita — eles devem ser iguais, ou você precisa usar atribuição com asterisco (veja abaixo).
Atribuição Encadeada (Um Valor, Várias Variáveis)
Para dar a várias variáveis o mesmo valor inicial, encadeie os operadores de atribuição:
x = y = z = 0
print(x, y, z)Saída:
0 0 0Python avalia 0 uma vez e vincula os três nomes ao mesmo objeto. Isso funciona corretamente para objetos imutáveis (inteiros, strings, tuplas). Cuidado com padrões mutáveis como valor padrão — os três nomes apontam para o mesmo objeto lista:
# Pitfall: shared mutable object
a = b = c = []
a.append(1)
print(b) # [1] — b is the same list, not a copy!Se você precisar de listas independentes, use uma compreensão de lista ou atribuições separadas:
a, b, c = [], [], []Desempacotando um Iterável
Você pode desempacotar qualquer iterável — uma lista, tupla, string, range ou outro — diretamente em variáveis:
a, b, c = [10, 20, 30]
print(a, b, c)Saída:
10 20 30Este é o mesmo mecanismo da atribuição múltipla; Python não se importa se o lado direito é uma tupla literal ou uma variável lista. Por exemplo, desempacotar uma tupla funciona de forma idêntica:
coords = (51.5, -0.1)
lat, lon = coords
print(lat) # 51.5
print(lon) # -0.1Consulte o capítulo Desempacotar Tuplas para uma análise mais detalhada desse padrão.
Atribuição com Asterisco (Desempacotamento Estendido)
Quando você não sabe quantos itens um iterável contém, prefixe um nome com * para coletar os itens restantes em uma lista:
first, *rest = [10, 20, 30, 40]
print(first) # 10
print(rest) # [20, 30, 40]O nome com asterisco pode aparecer em qualquer posição na lista de destino — no início, no meio ou no final:
first, *middle, last = [10, 20, 30, 40]
print(first) # 10
print(middle) # [20, 30]
print(last) # 40*head, second_last, last = range(1, 6)
print(head) # [1, 2, 3]
print(second_last) # 4
print(last) # 5Regras para atribuição com asterisco:
- Apenas um nome com asterisco é permitido por instrução.
- O nome com asterisco sempre coleta uma
list, mesmo quando corresponde a zero ou um item. - Todos os nomes sem asterisco devem corresponder exatamente a um item.
Quando Usar Cada Padrão
| Padrão | Caso de uso típico |
|---|---|
a, b = 1, 2 | Retornar múltiplos valores de uma função; trocar duas variáveis |
x = y = z = 0 | Inicializar um grupo de contadores ou flags com o mesmo valor |
a, b, c = my_list | Desempacotar uma sequência de tamanho fixo em nomes significativos |
first, *rest = items | Separar o início do restante em uma lista de tamanho desconhecido |
Tópicos Relacionados
- Variáveis Python — como as variáveis funcionam e as regras de nomenclatura
- Nomes de Variáveis — convenções de nomenclatura (snake_case, palavras-chave)
- Desempacotar Tuplas — cobertura detalhada do desempacotamento de tuplas
- Listas Python — fundamentos de listas referenciados nos exemplos acima
- Variáveis Globais — escopo e a palavra-chave
global