Próximo Capítulo: Funções
Superficial e Profunda Copiar
Introdução
Como vimos no capítulo “Tipos de Dados e Variáveis”, Python tem um comportamento estranho – em comparação com outras linguagens de programação – quando a atribuição e a cópia simples de dados de tipos como inteiros e strings. A diferença entre cópia superficial e profunda é apenas relevante para objetos compostos, que são objetos contendo outros objetos, como listas ou instâncias de classe.,
no seguinte excerto de código y aponta para a mesma localização de memória que X. Isto muda, quando atribuímos um valor diferente a Y. neste caso y receberá uma localização de memória separada, como vimos no capítulo “tipos de dados e variáveis”.
>>> x = 3>>> y = x
mas mesmo que este comportamento interno pareça estranho em comparação com linguagens de programação como C, C++ e Perl, os resultados observáveis das atribuições respondem às nossas expectativas. Mas pode ser problemático, se copiarmos objetos mutáveis como listas e dicionários.
Python cria cópias reais somente se for necessário, i.e., se o utilizador, o programador, o exigir explicitamente.
vamos apresentá-lo aos problemas mais cruciais, que podem ocorrer ao copiar objetos mutáveis, I. E. ao copiar listas e dicionários.
Copiar uma lista
>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1
No exemplo acima uma lista simples é atribuído a colours1. Na etapa seguinte atribuímos cor1 a cores2. Depois disso, uma nova lista é atribuída ao colors2.como esperávamos, os valores das cores 1 permaneceram inalterados., Como foi no nosso exemplo no capítulo “tipos de dados e variáveis”, uma nova localização de memória foi alocada para colors2, porque atribuímos uma nova lista completa a esta variável.
>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1
mas a questão é, o que acontecerá se mudarmos um elemento da lista de cores 2 ou cores 1?no exemplo acima, atribuímos um novo valor ao segundo elemento de cores 2. Muitos iniciantes ficarão surpresos que a lista de cores 1 foi “automaticamente” alterada também.,
a explicação é que não houve nenhuma nova atribuição de cores 2, apenas para um de seus elementos.
Copiar com a Fatia Operador
É possível copiar completamente superficial lista de estruturas com a fatia de operadora sem ter qualquer um dos efeitos colaterais, o que temos descrito acima:
>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>>
Mas assim como uma lista contém sublistas, temos a mesma dificuldade, por exemplo, apenas apontadores para thesublists.,
>>> lst1 = ]>>> lst2 = lst1
Este comportamento é representado no diagrama a seguir:
Se você atribuir um novo valor a um Elemento 0 de uma das duas listas, não haverá nenhum efeito colateral. Problemas surgem, se você mudar um dos elementos da sub-lista.
>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]
O diagrama seguinte mostra o que acontece, se um dos elementos de uma sub-lista será alterado: tanto o conteúdo de lst1 e lst2 são alterados.,
Using the Method deepcopy from the Module copy
A solution to the described problems is to use the module “copy”. Este módulo fornece o método “copy”, que permite uma cópia completa de uma lista arbitrária, ou seja, rasa e outras listas.
O seguinte script usa nosso exemplo acima e este método:
from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1
Se nós salvar este script sob o nome de deep_copy.py e se chamarmos o script com ” python deep_copy.,py”, vamos receber a seguinte saída:
$ python deep_copy.py ]]
Próximo Capítulo: Funções