30 de março de 2018 • 2 min to read
Utilizando o Método Copy em Python
Entendendo a importância das referências em Python, realizando uma shallow copy utilizando o método copy.
Introdução
Referências são importantes para compreendermos como os argumentos são passados às funções.
Quando um método/função é declarado e seus argumentos são
passados, seus valores são copiados para atributos por meio
de parâmetros.
Para que possamos exemplificar melhor o nosso estudo, usaremos listas em Java Python
e usaremos uma referência para o parâmetro.
>>> # Exemplo 1: cópia de referência de uma lista
>>> ham = ['A', 'B', 'C', 'D', 'E', 'F']
>>> id(ham)
4461285128
>>> cheese = ham
>>> cheese
['A', 'B', 'C', 'D', 'E', 'F']
>>> id(cheese)
4461285128
>>> cheese[1] = 36
>>> cheese
['A', 36, 'C', 'D', 'E', 'F']
>>> ham
['A', 36, 'C', 'D', 'E', 'F']
>>> cheese == ham
True
>>> cheese is ham
True
Assim, podemos concluir que a nova variável declarada 'cheese', apenas apontou para a referência da variável 'ham', é tanto que as duas variáveis possuem o mesmo id.
Agora veremos um exemplo de uma nova lista criada a partir de outra.
>>> # Exemplo 2: duas listas distintas
>>> ham = ['A', 'B', 'C', 'D', 'E']
>>> id(ham)
4584690568
>>> # slice assignment
>>> cheese = ham[:] # uma nova lista criada
>>> cheese
['A', 'B', 'C', 'D', 'E']
>>> cheese == ham
True
>>> cheese is ham
False
>>> cheese[1] = 36
>>> cheese
['A', 36, 'C', 'D', 'E']
>>> ham
['A', 'B', 'C', 'D', 'E']
>>> cheese == ham
False
>>> cheese is ham
False
Nesse exemplo, percebemos que a variável declarada 'cheese', realizou uma cópia superficial (shallow copy) de 'ham' utilizando um slice assignment, o que cria um novo id para a variável que, ao modificarmos seu valor, 'ham' continuou inalterado.
No terceiro exemplo, utilizaremos o método copy para realizarmos uma shallow copy.
>>> # Exemplo 3: shallow copy utilizando o método copy
>>> import copy # importamos o módulo copy
>>> ham = ['A', 'B', 'C', 'D', 'E']
>>> id(ham)
4467385800
>>> cheese = copy.copy(ham)
>>> cheese
['A', 'B', 'C', 'D', 'E']
>>> id(cheese)
4467370888
>>> cheese == ham
True
>>> cheese is ham
False
>>> cheese[3] = 29
>>> cheese
['A', 'B', 'C', 29, 'E']
>>> ham
['A', 'B', 'C', 'D', 'E']
>>> cheese == ham
False
Conclusão
Bom, esse post foi bem básico e tentou abordar o uso das listas utilizando as slice assignment e o método copy, que ao meu ver é mais Pythonico. Lembre-se o que diz The Zen of Python:
...
'Explicit is better than implicit'.
...
Espero ter ajudado a enriquecer seus conhecimentos nessa linguagem cobra 🐍 que é o Python. Em um post futuro irei abordar sobre o método deepcopy, também do módulo copy.