Como copiar uma lista ou um dicionário em Python

Publicado em 2012-11-25 por Vinicius Assef

Listas e dicionários são tipos imutáveis, em Python. O funcionamento deles pode não ser o que você espera.

tl;dr copie listas com slicing [:] e dicionários com .copy().

Uma pessoa

Para ilustrar o funcionamento deles, pense em uma pessoa e em suas características (apelido e idade):

>>> luciana = ["lu", 19]
>>> luciana
['lu', 19]

A mesma pessoa

Agora pense que Luciana tem um sobrenome: Ferreira. Então, já que Luciana e Ferreira são a mesma pessoa, podemos fazer isso:

>>> lu_ferreira = luciana
>>> lu_ferreira
['lu', 19]

É mais do que lógico pensar que, se alguma característica de Luciana mudar, a mesma coisa deve acontecer com Ferreira, certo? Afinal, elas são a mesma pessoa! Vamos adicionar a cor dos olhos à lista e ver o que acontece?

>>> luciana.append("castanho")
>>> luciana
['lu', 19, 'castanho']

>>> lu_ferreira
['lu', 19, 'castanho']

>>> id(luciana), id(lu_ferreira)
22972304, 22972304

Viu? Aconteceu o que esperávamos: ao mudar (ou adicionar) um item à lista de características da Luciana, a lista de característicias de Ferreira também mudou. Da mesma forma que Luciana e Ferreira são a mesma pessoa, luciana e lu_ferreira são o mesmo local de memória. Veja que eles têm o mesmo id.

Observação: o id que vai aparecer se você testar esse trecho em seu computador certamente será diferente do meu, mas os dois ids serão iguais.

É assim que variáveis funcionam em Python: eles são etiquetas para um determinado local na memória.

Outra pessoa

Mas se quisermos copiar os dados da Luciana Ferreira para os da Luiza, que são parecidos? Afinal, elas têm o mesmo apelido!

Existem duas alternativas. Você pode usar a que preferir:

Usando slicing:

>>> luiza = luciana[:]

>>> luiza
['lu', 19, 'castanho']
>>> id(luiza)
22831711

Convertendo uma lista em lista:

>>> luiza = list(luciana)

>>> luiza
['lu', 19, 'castanho']
>>> id(luiza)
22972304

Eu, particularmente, prefiro usar slicing, mas é uma questão meramente pessoal. O importante é que os ids de luiza e de luciana são diferentes.

Agora, se adicionarmos a altura da Luiza à lista de características dela, teremos:

>>> luiza.append(1.65)
>>> luiza
['lu', 19, 'castanho', 1.65]

>>> luciana
['lu', 19, 'castanho']

Dicionário

Com dicionários o conceito é o mesmo, mas existe o método dict.copy():

>>> luciana = {"apelido": "lu", "idade": 19, "cor_dos_olhos": "castanho"}
>>> luciana
{'apelido': 'lu', 'idade': 19, 'cor_dos_olhos': 'castanho'}
>>> id(luciana)
22990032

>>> luiza = luciana.copy()
>>> luiza["altura"] = 1.65
>>> luiza
{'apelido': 'lu', 'idade': 19, 'cor_dos_olhos': 'castanho', 'altura': 1.65}
>>> id(luiza)
11722583

Se preferir, você também pode converter o dicionário para dicionário:

>>> luiza = dict(luciana)

Conclusão

list_b = list_a nunca copiará uma lista. Nem um dicionário.

Para copiar listas, use

>>> b = a[:]

ou

>>> b = list(a)

Para copiar dicionários, use

b = a.copy()

ou

b = dict(a)

Vinicius Assef

Eu sou apaixonado por Python e shell script.

Aprenda com seus erros e dê nome certo às coisas.