Veja antes:
Cópia rasa (shallow copy)
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 copyimport 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!
Cara... muito obrigado! Já tava quase desistindo de um script. Tinha certeza da lógica, mas não ia :-(
ResponderExcluirSua dica salvou o dia!