Como Copiar um Dicionário ou Lista

Neste tutorial de nosso Curso de Python com certificado, vamos aprender duas maneiras diferentes de copiar um dicionário: uma rasa (shallow) e outra profunda (deep).

Veja antes:


Cópia rasa (shallow copy)

Você foi contratado por uma grande empresa multinacional para programar e gerenciar o sistema dela.

Em um dicionário, você salvou os dados de login e senha de alguns funcionários, com nome login:
login={'joao'   : 'senha',
       'maria'  : '123456',
       'zezinho': 'restart'}

Por exemplo, o login 'joao' tem senha 'senha'. Já a senha de 'maria' é '123456' e a senha do 'zezinho' é 'restart'.

Como você é um bom programador, afinal estudou pelo Curso Python Progressivo, decidiu criar um backup e salvar esses dados.

Criou a variável backup e salvou uma cópia do dicionário login.
backup = login

Pronto, agora o dicionário backup tem uma cópia dos dados de login da empresa.

Porém, a galera descobriu que a senha do zezinho é 'restart' e ficou zoando ele.
Ele pediu pra você mudar a senha dele para 'ironmaiden'.

Você fez o seguinte:
login['zezinho'] = 'ironmaiden'

Pronto, senha do zezinho foi mudada.

Agora vamos imprimir o dicionário login (com a alteração) e a cópia antiga, o backup (antes da cópia):

Olha só!
Você alterou o dicionário login, mas o dicionário backup também foi alterado!
Por que isso aconteceu ?


Referência e Cópia rasa

Quando definimos a variável login e criamos nosso dicionário, reservamos um espaço na memória do computador.

Quando fazemos: backup = login

Estamos criando a variável backup, porém ela não é um dicionário, ela vai simplesmente armazenar uma referência para a variável login (essa sim é um espaço na memória com um dicionário lá).

Ou seja, a variável backup tem um endereço de memória (referência), que aponta pro local de memória de login.

Por isso, quando alteramos login, automaticamente alteramos backup, pois backup aponta para aquele endereço de memória de login, que alteramos!!!

Ou seja, não fizemos uma cópia de verdade, fizemos uma cópia rasa.
Vamos aprender como fazer uma cópia de verdade.



Cópia profunda (deep copy): copy.deepcopy()

Primeiro, importamos o módulo copy
import copy 

E pronto! Aí sim criamos uma cópia de verdade.
Agora, a variável backup aponta para um endereço de memória diferente do endereço de memória onde está a variável login.

Nesse novo endereço, tem um outro dicionário diferente, um novo.
É uma cópia profunda (do inglês, deep).

import copy 
login={'joao'   : 'senha',
       'maria'  : '123456',
       'zezinho': 'restart'}

backup = copy.deepcopy(login)

print(backup)

login['zezinho'] = 'ironmaiden'

print(login)
print(backup)

Ou seja, cuidado ao passar listas e dicionários por referência!
As vezes queremos passar a referência e as vezes uma cópia (profunda), cuidado, moçada!

Nenhum comentário:

Postar um comentário