25 de novembro de 2012

Como copiar uma lista e um dicionário em Python

Em Python, listas e dicionários são tipos de dados mutáveis e para ilustrar o funcionamento deles, pense em uma pessoa e em suas características (nome e idade):
>>> dados_da_luciana = ['luciana', 19]
>>> print dados_da_luciana
['luciana', 19] 

Agora pense que Luciana tem um apelido: Lu. Então, já que Luciana e Lu são a mesma pessoa, podemos fazer isso:
>>> dados_da_lu = dados_da_luciana
>>> print dados_da_lu
['luciana', 19] 

É mais do que lógico pensar que, se alguma característica de Luciana mudar, a mesma coisa deve acontecer com a Lu, certo? Afinal elas são a mesma pessoa! Portanto, vamos adicionar a cor dos olhos à lista e ver o que acontece:
>>> dados_da_luciana.append('castanho')
>>> print dados_da_luciana
['luciana', 19, 'castanho']
>>> print dados_da_lu
['luciana', 19, 'castanho']
>>> print id(dados_da_luciana), id(dados_da_lu)
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 da Lu também mudou. Da mesma forma que Luciana e Lu são a mesma pessoa, dados_da_luciana e dados_da_lu 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.

Mas se quisermos copiar os dados da Luciana para os da Fernanda, que são parecidos? Temos duas alternativas, e você pode usar a que preferir:
>>> dados_da_fernanda = list(dados_da_luciana) # forma 1
>>> print dados_da_fernanda, id(dados_da_fernanda)
['luciana', 19, 'castanho'], 22972304
>>> dados_da_fernanda = dados_da_luciana[:] # forma 2
>>> print dados_da_fernanda, id
['luciana', 19, 'castanho'], 22831711 
Eu, particularmente, prefiro a primeira forma, mas é uma questão meramente pessoal. O importante é que os ids das variáveis são diferentes.

Agora, se adicionarmos a altura da Fernanda à lista de características dela, teremos:
>>> dados_da_fernanda.append(1.65)
>>> print dados_da_fernanda
['luciana', 19, '9983-1725', 'castanho', 1.65]
>>> print dados_da_luciana
['luciana', 19, '9983-1725', 'castanho'] 

Com dicionários, o conceito é o mesmo, mas você pode usar o método dict.copy():
>>> dados_da_luciana = {'nome': 'luciana', 'idade': 19, 'cor_dos_olhos': 'castanho'}
>>> dados_da_fernanda = dados_da_luciana.copy()
>>> dados_da_fernanda['altura'] = 1.65
>>> print dados_da_luciana, id(dados_da_luciana)
{'nome': 'luciana', 'idade': 19, 'cor_dos_olhos': 'castanho'}, 22990032
>>> print dados_da_fernanda, id(dados_da_fernanda)
{'nome': 'luciana', 'idade': 19, 'cor_dos_olhos': 'castanho', 'altura': 1.65}, 11722583 

Resumindo, nunca pense que b = a copiará uma lista ou um dicionário. Para copiar listas, use b = list(a) ou b = a[:].

Para copiar dicionários, use b = a.copy() ou b = dict(a).

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

Nenhum comentário:

Postar um comentário

Marcadores