Recentemente, percebi que em:
a = [1]
print(a, type(a))
[b] = a
print(b)
b = a[0]
a = [1,2]
b = a[0]
print(b)
try :
[b] = a
except Exception as e:
print(e)
A notação [b] = a
poderia realmente funcionar.
Por que funciona, é relevante em situações mais complexas? Funciona contra "Deve haver uma - e de preferência apenas uma - maneira óbvia de fazer isso" ?
É um caso estranho de sintaxe geral de descompactação, usada em contextos como troca de duas variáveis sem um temporário:
ou apenas descompactando diretamente em outros contextos, por exemplo, iterando chaves e valores de a
dict
:Os colchetes externos geralmente são opcionais (
[a, b] = b, a
efor [key, value] in mydict.items():
funcionariam da mesma forma, mas não há razão para incluí-los), mas ao descompactar um único valor, você precisa dos colchetes ou de uma vírgula isolada, que pode facilmente passar despercebida:É diferente da indexação simples, porque verifica se existe exatamente um elemento, nem mais, nem menos, levantando uma exceção se essa suposição for violada ; a indexação simples informa apenas se a sequência é muito curta, não muito longa.
[b] = a
não está fazendo o que você pensa.Isso descompacta todos os itens
a
e os atribui às variáveis entre colchetes.Como você tem mais de um valor,
a
isso falha.Exemplo que funciona:
Observe que você também pode usar
a, b, c = x
Desembalagem parcial:
Em Python, a expressão
[a] = [1]
usa unpacking iterável . Aqui está o que acontece:[1]
é uma lista contendo o único elemento 1.[a]
também é uma lista, mas contém uma única variável a.[a] = [1]
, Python atribui o valor 1 a a.Então, essencialmente, é equivalente a dizer
a = 1
, mas usando sintaxe de descompactação iterável. É uma maneira concisa de atribuir valores a variáveis de um iterável como uma lista.A descompactação iterável, também conhecida como descompactação ou atribuição múltipla, é um recurso do Python que permite atribuir os elementos de um iterável (como uma lista, tupla ou string) a múltiplas variáveis em uma única instrução.
Aqui está um exemplo básico:
No exemplo acima, a lista [1, 2, 3] é descompactada e seus elementos são atribuídos às variáveis a, b e c, respectivamente. Após a execução desta linha, a será 1, b será 2 e c será 3.
A descompactação iterável também pode ser usada com outros tipos de iteráveis, como tuplas ou strings:
É importante observar que o número de variáveis no lado esquerdo do operador de atribuição (=) deve corresponder ao número de elementos no iterável que está sendo descompactado. Caso contrário, você receberá um ValueError indicando que há muitos ou poucos valores para descompactar.