W3docs

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:

  1. Atribuição múltipla — diferentes valores para diferentes variáveis em uma linha.
  2. Atribuição encadeada — o mesmo valor para várias variáveis ao mesmo tempo.
  3. Desempacotamento de iterável — extrair itens de uma lista, tupla ou qualquer iterável.
  4. 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, value3

Python 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:

python— editable, runs on the server

Saída:

Python
3.7
True

Isso 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 = 5

Na 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 0

Python 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 30

Este é 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.1

Consulte 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)         # 5

Regras 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ãoCaso de uso típico
a, b = 1, 2Retornar múltiplos valores de uma função; trocar duas variáveis
x = y = z = 0Inicializar um grupo de contadores ou flags com o mesmo valor
a, b, c = my_listDesempacotar uma sequência de tamanho fixo em nomes significativos
first, *rest = itemsSeparar o início do restante em uma lista de tamanho desconhecido

Tópicos Relacionados

Prática

Prática
Which of the following are valid ways to assign multiple values in Python?
Which of the following are valid ways to assign multiple values in Python?
Was this page helpful?