"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Cópia superficial versus cópia profunda – o que são realmente? - Exemplos com JavaScript e Python

Cópia superficial versus cópia profunda – o que são realmente? - Exemplos com JavaScript e Python

Publicado em 31/08/2024
Navegar:830

Introdução

No mundo da programação, copiar dados é uma tarefa comum. No entanto, nem todas as cópias são criadas iguais. Dois termos que aparecem frequentemente são cópia superficial e cópia profunda. Compreender a diferença entre eles é crucial para evitar erros que podem ser difíceis de detectar.

O que é uma cópia superficial?

Uma cópia superficial copia apenas o primeiro nível de um objeto, deixando referências aos dados originais em níveis mais profundos. Isso significa que se o objeto original tiver outros objetos dentro dele (aninhados), a cópia superficial copiará apenas as referências a esses objetos, não os próprios objetos.

Exemplo em JavaScript

const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]

Exemplo em Python

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)

shallow_copy[2][0] = 99

print(original_list)  # [1, 2, [99, 4]]
print(shallow_copy)   # [1, 2, [99, 4]]

Dica:

Uma cópia superficial é útil quando você sabe que não precisa modificar objetos aninhados. É mais rápido e consome menos memória do que uma cópia profunda.

Observação:

Em JavaScript, se você usar Array.slice() ou Object.assign(), você estará fazendo uma cópia superficial!

O que é uma cópia profunda?

Uma cópia profunda copia todos os níveis de um objeto, duplicando até mesmo estruturas aninhadas. Isso significa que quaisquer alterações feitas na cópia não afetarão o objeto original.

Exemplo em JavaScript

const originalArray = [1, 2, [3, 4]];
const deepCopy = JSON.parse(JSON.stringify(originalArray));

deepCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [3, 4]]
console.log(deepCopy);      // [1, 2, [99, 4]]

Exemplo em Python

import copy

original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)

deep_copy[2][0] = 99

print(original_list)  # [1, 2, [3, 4]]
print(deep_copy)      # [1, 2, [99, 4]]

Dica:

Se você estiver trabalhando com estruturas de dados complexas ou aninhadas, a cópia profunda é a opção mais segura para evitar efeitos colaterais indesejados.

Observação:

Em Python, copy.deepcopy() é seu amigo quando você precisa duplicar objetos complexos com segurança.

Comparação direta: cópia superficial vs cópia profunda

Aqui está uma comparação direta entre cópia superficial e cópia profunda:

Recurso Cópia superficial Cópia profunda
Cópia superficial Sim Não
Cópia detalhada Não Sim
Modificações no objeto original afetam a cópia Sim Não
Complexidade Baixo Alto

Dica:

Lembre-se, uma cópia superficial é mais rápida, mas uma cópia profunda é mais segura ao trabalhar com objetos complexos.

Casos de uso comuns

Quando usar cópia superficial

  • Quando você trabalha com objetos ou estruturas de dados simples.
  • Quando você precisa melhorar o desempenho e modificações profundas não são um problema.
  • Exemplos: configurações de aplicativos, espelhamento temporário de dados.

Quando usar cópia profunda

  • Quando você trabalha com estruturas de dados aninhadas ou complexas.
  • Quando você precisa garantir que as alterações na cópia não afetem o original.
  • Exemplos: manipulação complexa de dados, aplicações que exigem alta segurança e consistência.

Observação:

Cópias superficiais são ótimas para duplicar configurações leves de aplicativos ou dados temporários!

Problemas comuns e como evitá-los

Problemas com cópia superficial

Um erro comum é usar uma cópia superficial em vez de uma cópia profunda quando os dados estão aninhados. Isso pode levar a modificações indesejadas no objeto original.

Exemplo:

const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)

Dica:

Sempre verifique se o seu objeto tem níveis aninhados antes de decidir entre uma cópia superficial ou profunda.

Ferramentas e funções para fazer cópias em JavaScript

Usando Object.assign() para cópia superficial

const originalObject = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, originalObject);

Usando ...spread para cópia superficial

const originalArray = [1, 2, 3];
const shallowCopy = [...originalArray];

Usando StructureClone() para Deep Copy

const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = structuredClone(originalObject);

Dica:

structuredClone() é perfeito para copiar estruturas complexas ou circulares sem quebrar a cabeça.

Usando bibliotecas como Lodash para Deep Copy

const _ = require('lodash');
const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(originalObject);

Ferramentas e funções para fazer cópias em Python

Usando o módulo de cópia

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)

Diferenças entre copy.copy() e copy.deepcopy()

  • copy.copy(): cópia superficial.
  • copy.deepcopy(): cópia profunda.

Observação:

Em Python, às vezes uma cópia superficial é tudo que você precisa para evitar alterações acidentais em suas listas!

Resumo e Conclusão

Em resumo, tanto as cópias superficiais quanto as cópias profundas têm sua utilidade. A chave é compreender a estrutura dos dados com os quais você está trabalhando e escolher o método de cópia apropriado.

Perguntas frequentes

1. A cópia superficial é sempre mais rápida do que a cópia profunda?

Sim, porque copia menos dados.

2. Você pode fazer uma cópia profunda sem bibliotecas externas em JavaScript?

Sim, com JSON.parse(JSON.stringify()) ou estruturadoClone().

3. O que acontece se eu tentar modificar um objeto aninhado em uma cópia superficial?

O objeto original também será afetado.

4. É melhor sempre usar cópia profunda para evitar problemas?

Não necessariamente, apenas quando você trabalha com estruturas de dados complexas.

5. Quais vantagens o StructureClone() tem sobre outros métodos de cópia profunda em JavaScript?

É nativo, suporta estruturas circulares e é mais eficiente que JSON.parse(JSON.stringify()), além de permitir a transferência completa de valores de um objeto para outro.


Erros ao usar cópias superficiais em vez de cópias profundas são mais comuns do que você pensa! Espero que este pequeno guia ajude você a evitar problemas ao copiar dados.

Deixe-me saber nos comentários, você já sabia sobre cópias profundas e superficiais e já teve algum problema por causa delas?


Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python

Caderno da BYXN? | Subpilha

Meu caderno público! ???. Clique para ler o caderno da BYXN?, uma publicação da Substack. Lançado há 17 dias.

Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python bhyxen.substack.com

Foto de Mohammad Rahmani no Unsplash

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/bhyxen/shallow-copy-vs-deep-copy-que-son-realmente-ejemplos-con-javascript-y-python-10ja?1 Se houver alguma violação , entre em contato com study_golang @163.comdelete
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3