En el mundo de la programación, copiar datos es una tarea común. Sin embargo, no todas las copias son iguales. Dos términos que a menudo aparecen son shallow copy (copia superficial) y deep copy (copia profunda). Entender la diferencia entre ellas es crucial para evitar errores que pueden ser difíciles de detectar.
Una shallow copy copia solo el primer nivel de un objeto, dejando las referencias a los datos originales en los niveles más profundos. Esto significa que si el objeto original tiene otros objetos dentro de él (anidados), la shallow copy solo copiará las referencias a esos objetos, no los objetos en sí.
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]]
Una shallow copy es útil cuando sabes que no necesitas modificar objetos anidados. Es más rápida y consume menos memoria que una deep copy.
En JavaScript, si usas Array.slice() o Object.assign(), ¡estás haciendo una shallow copy!
Una deep copy copia todos los niveles de un objeto, duplicando incluso las estructuras anidadas. Esto significa que cualquier cambio realizado en la copia no afectará al 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]]
Si estás trabajando con estructuras de datos complejas o anidadas, la deep copy es la opción más segura para evitar efectos colaterales no deseados.
En Python, copy.deepcopy() es tu amigo cuando necesitas duplicar objetos complejos con seguridad.
Aquí te dejo una comparación directa entre shallow copy y deep copy:
Característica | Shallow Copy | Deep Copy |
---|---|---|
Copia superficial | Sí | No |
Copia profunda | No | Sí |
Modificaciones al objeto original afectan la copia | Sí | No |
Complejidad | Baja | Alta |
Recuerda, una shallow copy es más rápida, pero una deep copy es más segura cuando trabajas con objetos complejos.
¡Las shallow copies son geniales para duplicar configuraciones de aplicaciones ligeras o datos temporales!
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.
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)
Siempre verifica si tu objeto tiene niveles anidados antes de decidir entre una shallow o deep copy.
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() es perfecto para copiar estructuras complejas o circulares sin romper tu cabeza.
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)
¡En Python, una copia superficial a veces es todo lo que necesitas para evitar cambios accidentales en tus listas!
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.
Sí, debido a que copia menos datos.
Sí, con JSON.parse(JSON.stringify()) o structuredClone().
El objeto original también se verá afectado.
No necesariamente, solo cuando trabajas con estructuras de datos complejas.
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?
Photo by Mohammad Rahmani on Unsplash
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3