>  기사  >  백엔드 개발  >  얕은 복사와 깊은 복사 – 실제로는 무엇입니까? - JavaScript 및 Python의 예

얕은 복사와 깊은 복사 – 실제로는 무엇입니까? - JavaScript 및 Python의 예

王林
王林원래의
2024-08-29 06:33:01458검색

소개

프로그래밍 세계에서 데이터 복사는 일반적인 작업입니다. 그러나 모든 복사본이 동일하게 생성되는 것은 아닙니다. 자주 등장하는 두 가지 용어는 얕은 카피딥 카피입니다. 감지하기 어려운 오류를 피하려면 둘 사이의 차이점을 이해하는 것이 중요합니다.

얕은 복사본이란 무엇입니까?

얕은 복사본은 개체의 첫 번째 수준만 복사하고 더 깊은 수준의 원본 데이터에 대한 참조는 남겨 둡니다. 즉, 원본 개체 내부에 다른 개체가 있는 경우(중첩) 얕은 복사본은 개체 자체가 아닌 해당 개체에 대한 참조만 복사합니다.

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]]

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]]

팁:

얕은 복사본은 중첩된 개체를 수정할 필요가 없다는 것을 알고 있는 경우 유용합니다. 전체 복사보다 속도가 빠르고 메모리 소모도 적습니다.

메모:

JavaScript에서 Array.slice()나 Object.Assign()을 사용하면 얕은 복사를 하는 것입니다!

딥 카피란 무엇입니까?

딥 카피는 객체의 모든 레벨을 복사하여 중첩된 구조까지 복제합니다. 이는 복사본에 대한 변경 사항이 원본 개체에 영향을 미치지 않음을 의미합니다.

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]]

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]]

팁:

복잡하거나 중첩된 데이터 구조로 작업하는 경우 원치 않는 부작용을 피할 수 있는 가장 안전한 옵션은 전체 복사입니다.

메모:

Python에서는 복잡한 객체를 안전하게 복제해야 할 때 copy.deepcopy()가 도움이 됩니다.

직접 비교: 얕은 복사와 깊은 복사

얕은 복사와 깊은 복사를 직접 비교한 ​​내용은 다음과 같습니다.

Característica Shallow Copy Deep Copy
Copia superficial No
Copia profunda No
Modificaciones al objeto original afectan la copia No
Complejidad Baja Alta

Tip:

Recuerda, una shallow copy es más rápida, pero una deep copy es más segura cuando trabajas con objetos complejos.

Casos de Uso Comunes

Cuándo Usar Shallow Copy

  • Cuando trabajas con objetos o estructuras de datos simples.
  • Cuando necesitas mejorar el rendimiento y las modificaciones profundas no son un problema.
  • Ejemplos: Configuraciones de aplicaciones, duplicación de datos temporales.

Cuándo Usar Deep Copy

  • Cuando trabajas con estructuras de datos anidadas o complejas.
  • Cuando necesitas asegurarte de que los cambios en la copia no afecten el original.
  • Ejemplos: Manipulación de datos complejos, aplicaciones que requieren alta seguridad y consistencia.

Nota:

¡Las shallow copies son geniales para duplicar configuraciones de aplicaciones ligeras o datos temporales!

Problemas Comunes y Cómo Evitarlos

Problemas con Shallow Copy

Un error común es usar una shallow copy en lugar de una deep copy cuando los datos son anidados. Esto puede llevar a modificaciones no deseadas en el objeto original.

Ejemplo:

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

shallowCopy[2][0] = 99;

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

Tip:

Siempre verifica si tu objeto tiene niveles anidados antes de decidir entre una shallow o deep copy.

Herramientas y Funciones para Realizar Copias en JavaScript

Uso de Object.assign() para Shallow Copy

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

Uso de ...spread para Shallow Copy

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

Uso de structuredClone() para Deep Copy

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

Tip:

structuredClone() es perfecto para copiar estructuras complejas o circulares sin romper tu cabeza.

Uso de Librerías como Lodash para Deep Copy

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

Herramientas y Funciones para Realizar Copias en Python

Uso del Módulo copy

import copy

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

Diferencias entre copy.copy() y copy.deepcopy()

  • copy.copy(): Shallow copy.
  • copy.deepcopy(): Deep copy.

Nota:

¡En Python, una copia superficial a veces es todo lo que necesitas para evitar cambios accidentales en tus listas!

Resumen y Conclusión

En resumen, tanto las shallow copies como las deep copies tienen sus usos. La clave es entender la estructura de los datos con los que estás trabajando y elegir el método de copia adecuado.

FAQs

1. ¿Es shallow copy siempre más rápida que deep copy?

Sí, debido a que copia menos datos.

2. ¿Se puede hacer una deep copy sin librerías externas en JavaScript?

Sí, con JSON.parse(JSON.stringify()) o structuredClone().

3. ¿Qué sucede si intento modificar un objeto anidado en una shallow copy?

El objeto original también se verá afectado.

4. ¿Es mejor usar siempre deep copy para evitar problemas?

No necesariamente, solo cuando trabajas con estructuras de datos complejas.

5. ¿Qué ventajas tiene structuredClone() frente a otros métodos de deep copy en JavaScript?

Es nativo, soporta estructuras circulares y es más eficiente que JSON.parse(JSON.stringify()), además de que permite transferir por completo los valores de un objeto a otro.


¡Los errores al usar copias superficiales en lugar de profundas son más comunes de lo que piensas! Espero que esta pequeña guía te ayude a evitar cualquier problema a la hora de copiar datos.

Déjame saber en los comentarios, ¿ya conocías las deep y shallow copies y has tenido problema alguna vez debido a ellas?


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

La libreta de BYXN ? | Substack

¡Mi libreta de apuntes pública! ???. Click to read La libreta de BYXN ?, a Substack publication. Launched 17 days ago.

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

Photo by Mohammad Rahmani on Unsplash

위 내용은 얕은 복사와 깊은 복사 – 실제로는 무엇입니까? - JavaScript 및 Python의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.