Capítulo Anterior: Conjuntos e Congelados Define
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 ]]

Capítulo Anterior: Conjuntos e Congelados Define
Próximo Capítulo: Funções

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *