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.
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.
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]]
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]]
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.
Em JavaScript, se você usar Array.slice() ou Object.assign(), você estará fazendo uma cópia superficial!
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.
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]]
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]]
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.
Em Python, copy.deepcopy() é seu amigo quando você precisa duplicar objetos complexos com segurança.
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 |
Lembre-se, uma cópia superficial é mais rápida, mas uma cópia profunda é mais segura ao trabalhar com objetos complexos.
Cópias superficiais são ótimas para duplicar configurações leves de aplicativos ou dados temporários!
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.
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)
Sempre verifique se o seu objeto tem níveis aninhados antes de decidir entre uma cópia superficial ou profunda.
const originalObject = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, originalObject);
const originalArray = [1, 2, 3]; const shallowCopy = [...originalArray];
const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = structuredClone(originalObject);
structuredClone() é perfeito para copiar estruturas complexas ou circulares sem quebrar a cabeça.
const _ = require('lodash'); const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = _.cloneDeep(originalObject);
import copy original_list = [1, 2, [3, 4]] shallow_copy = copy.copy(original_list) deep_copy = copy.deepcopy(original_list)
Em Python, às vezes uma cópia superficial é tudo que você precisa para evitar alterações acidentais em suas listas!
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.
Sim, porque copia menos dados.
Sim, com JSON.parse(JSON.stringify()) ou estruturadoClone().
O objeto original também será afetado.
Não necessariamente, apenas quando você trabalha com estruturas de dados complexas.
É 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?
Foto de Mohammad Rahmani no Unsplash
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