cópia profunda e cópia superficial de notas python

Deep Copy e Shallow Copy são duas maneiras de copiar objetos em Python, possuem características e cenários aplicáveis ​​diferentes.

  1. Cópia superficial:

    • Use copy()métodos ou operações de fatiamento para criar cópias superficiais.
    • A cópia superficial cria um novo objeto, mas os elementos do objeto (como listas, dicionários, etc.) ainda são referências aos elementos do objeto original, ou seja, os elementos do novo objeto compartilham o mesmo endereço de memória que o elementos do objeto original.
    • A modificação de elementos no novo objeto afeta os elementos correspondentes no objeto original e vice-versa.
    • Adequado para estruturas de dados simples ou cenários onde parte dos dados precisa ser compartilhada.
  2. Cópia profunda:

    • Use deepcopy()uma função para criar uma cópia profunda, localizada copyno módulo.
    • A cópia profunda cria um novo objeto e copia recursivamente todos os elementos do objeto, incluindo listas aninhadas, dicionários, etc. Cada elemento é independente e não compartilha um endereço de memória com o objeto original.
    • A modificação de elementos no novo objeto não afeta os elementos do objeto original e vice-versa.
    • Adequado para estruturas de dados complexas ou cenários que exigem replicação totalmente independente.

Código de amostra:

import copy

# 原始列表
original_list = [1, [2, 3], [4, 5, 6]]

# 浅拷贝
shallow_copy_list = original_list.copy()  # 或者 shallow_copy_list = original_list[:]
shallow_copy_list[0] = 100
shallow_copy_list[1][0] = 200

# 深拷贝
deep_copy_list = copy.deepcopy(original_list)
deep_copy_list[0] = 1000
deep_copy_list[1][0] = 2000

print("原始列表:", original_list)      # 原始列表: [1, [2000, 3], [4, 5, 6]]
print("浅拷贝列表:", shallow_copy_list)  # 浅拷贝列表: [100, [200, 3], [4, 5, 6]]
print("深拷贝列表:", deep_copy_list)    # 深拷贝列表: [1000, [2000, 3], [4, 5, 6]]

Em uma cópia superficial, as sublistas da nova lista são modificadas e a lista original também é afetada. Numa cópia profunda, as modificações na nova lista não afetarão a lista original. Dependendo das necessidades específicas, a escolha de um método de cópia adequado pode lidar melhor com as operações de cópia e modificação de objetos.

Características cópia profunda Cópia superficial
Copiar conteúdo Crie uma cópia completamente independente do objeto de destino Crie uma cópia superficial do objeto alvo, compartilhando parte do endereço de memória
correlação de dados Não compartilha memória com o objeto original, completamente independente Compartilha parte da memória com o objeto original, a modificação de um afetará os outros
hierarquia de objetos Para estruturas de dados aninhadas, copia recursivamente todos os objetos filhos Somente objetos de primeiro nível são copiados e, para estruturas de dados aninhadas, apenas referências são copiadas.
aplicabilidade Lide com estruturas de dados complexas e evite problemas causados ​​pela correlação de dados Lidar com estruturas de dados simples ou situações onde a memória compartilhada é necessária
Cenários de aplicação Evite a modificação dos dados originais e salve o status histórico ou instantâneo dos dados Gere cópias superficiais, para copiar estruturas de dados simples
Ambiente multithread ou multiprocesso Trabalhe com dados compartilhados em um ambiente multithread ou multiprocesso Processe dados independentes em um ambiente multithread ou multiprocesso
estrutura de dados recursiva Lide com estruturas de dados recursivas para evitar loops infinitos ou elementos duplicados Estrutura de dados adequada para cópias superficiais para evitar a cópia de grandes quantidades de dados
consumo de memória Pode consumir mais memória à medida que todos os objetos filhos são copiados O espaço de memória pode ser economizado devido ao compartilhamento de parte da memória.

Em geral, as cópias profundas são adequadas para processar estruturas de dados complexas, evitando a modificação dos dados originais, salvando estados históricos ou instantâneos de dados e processando dados compartilhados em ambientes multithread ou multiprocessos. A cópia superficial é adequada para processar estruturas de dados simples ou situações que requerem memória compartilhada, podendo economizar espaço de memória, mas precisa prestar atenção aos problemas causados ​​pela correlação de dados. Ao escolher um método de cópia, você precisa decidir se deseja usar cópia profunda ou cópia superficial de acordo com o cenário específico da aplicação.

Cópias superficiais e ponteiros

Cópias superficiais e ponteiros são um tanto semelhantes porque ambos envolvem a questão de dados compartilhados. A seguir está uma breve comparação das semelhanças e diferenças entre cópias superficiais e ponteiros:

Semelhanças:

  1. Memória compartilhada: cópias superficiais e ponteiros envolvem memória compartilhada. Quando uma cópia superficial copia um objeto, ela copia apenas a referência ao objeto, e não os dados em si, de modo que o objeto copiado compartilha parte da memória com o objeto original. Os ponteiros também acessam os dados por meio de referências, de modo que os dados apontados pelos ponteiros e os dados originais são compartilhados.

  2. Cópia superficial: Tanto a cópia superficial quanto o ponteiro copiam apenas a parte superficial do objeto. A cópia superficial copia apenas o objeto de primeiro nível e copia apenas a referência à estrutura de dados aninhada; o ponteiro aponta apenas para o endereço de memória dos dados, mas não copia os dados em si.

a diferença:

  1. Cópia de dados: Ao copiar um objeto, uma cópia superficial cria uma nova instância do objeto e copia a referência, sem copiar os dados reais. O ponteiro aponta apenas para o endereço de memória dos dados e não envolve a cópia dos dados em si.

  2. Propriedades do objeto: a cópia superficial é realizada por meio de métodos ou operações específicas do objeto.É um comportamento de cópia do objeto. Ponteiro é um tipo de dados usado para armazenar o endereço de memória dos dados. Não envolve cópia de objetos.

  3. Impacto das modificações: Com cópias superficiais, as modificações no objeto copiado podem afetar o objeto original porque compartilham parte da memória. Para ponteiros, a modificação dos dados apontados pelo ponteiro também afeta os dados originais.

Resumindo, cópias superficiais e ponteiros envolvem problemas de memória compartilhada, mas sua essência e cenários de aplicação são diferentes. A cópia superficial é um comportamento específico de cópia de objectos que é utilizado para copiar a referência de um objecto sem envolver a cópia dos próprios dados.É adequado para cenários como impedir a modificação dos dados originais e guardar o estado histórico ou instantâneo dos dados. . Ponteiro é um tipo de dados usado para armazenar o endereço de memória dos dados e é adequado para situações em que os dados precisam ser acessados ​​e modificados.

Acho que você gosta

Origin blog.csdn.net/qq_40140808/article/details/131902275
Recomendado
Clasificación