Desembalar (expandir e atribuir a múltiplas variáveis) tuplos e listas em Python

O negócio

Em Python, os elementos de um tuple ou lista podem ser expandidos e atribuídos a múltiplas variáveis. A isto chama-se desembalar sequência ou desembalar atribuição.

Os seguintes detalhes são descritos aqui.

  • Desempacotar o básico de tuplos e listas
  • Tupilos aninhados, listas desembaladas
  • Desembalar com Underscores:_
  • Desembalar com asteriscos:*

Ver o artigo seguinte para informação sobre a utilização de asteriscos para expandir e passar tufos, listas e dicionários como argumentos de função.

Desempacotar o básico de tuplos e listas

Quando as variáveis são escritas no lado esquerdo, separadas por vírgulas, a cada variável é atribuído um elemento do tuple ou lista no lado direito. É o mesmo tanto para os tuple como para as listas (os exemplos seguintes são escritos em forma de tuple).

t = (0, 1, 2)

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# 2

l = [0, 1, 2]

a, b, c = l

print(a)
print(b)
print(c)
# 0
# 1
# 2

Note-se que como os tuplos podem omitir parênteses redondos, isto pode ser usado para atribuir múltiplos valores a múltiplas variáveis numa única linha, como se segue.

a, b = 0, 1

print(a)
print(b)
# 0
# 1

Se o número de variáveis não corresponder ao número de elementos, ocorre um erro.

# a, b = t
# ValueError: too many values to unpack (expected 2)

# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)

Se o número de variáveis for inferior ao número de elementos, os restantes elementos podem ser atribuídos como uma lista anexando um asterisco ao nome da variável (ver abaixo).

Tupilos aninhados, listas desembaladas

Os tufos e listas aninhadas também podem ser desembalados. Se quiser desembalar também o conteúdo, anexe a variável numa das seguintes opções

  • ()
  • []
t = (0, 1, (2, 3, 4))

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)

print(type(c))
# <class 'tuple'>

a, b, (c, d, e) = t

print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4

Desempacotado com _underscore_.

Em Python, não apenas desempacotados, os valores que não são necessários são convencionalmente atribuídos ao sublinhado (underscore) _. Não há nenhum significado gramatical especial; são simplesmente atribuídos a uma variável chamada _.

t = (0, 1, 2)

a, b, _ = t

print(a)
print(b)
print(_)
# 0
# 1
# 2

Desembalar com asteriscos

Se o número de variáveis for inferior ao número de elementos, um asterisco no nome da variável fará com que os elementos sejam atribuídos em conjunto como uma lista.

Esta sintaxe tem sido implementada desde Python 3 e não está disponível em Python 2.

Os elementos são atribuídos desde o início e o fim às variáveis sem asteriscos, e os restantes elementos são atribuídos como uma lista às variáveis com asteriscos.

t = (0, 1, 2, 3, 4)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]

print(type(c))
# <class 'list'>

a, *b, c = t

print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4

*a, b, c = t

print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4

Por exemplo, se quiser atribuir apenas os dois primeiros elementos de um tuple ou lista a uma variável, poderá utilizar o sublinhado acima para as partes que não são necessárias.

a, b, *_ = t

print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]

O mesmo pode também ser escrito da seguinte forma

a, b = t[0], t[1]

print(a)
print(b)
# 0
# 1

Apenas um asterisco pode ser afixado. Se houver múltiplas variáveis marcadas com um asterisco, resultará um erro de SyntaxError porque não é possível determinar quantos elementos são atribuídos a cada variável.

# *a, b, *c = t
# SyntaxError: two starred expressions in assignment

Note-se que mesmo um único elemento atribuído a uma variável marcada com um asterisco é atribuído como uma lista.

t = (0, 1, 2)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2]

print(type(c))
# <class 'list'>

Se não houver elementos extra, é atribuída uma lista vazia.

a, b, c, *d = t

print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []