Maison > Article > développement back-end > Copie superficielle ou copie approfondie : que sont-elles réellement ? - Exemples avec JavaScript et Python
Dans le monde de la programmation, copier des données est une tâche courante. Cependant, toutes les copies ne sont pas égales. Deux termes qui apparaissent souvent sont copie superficielle et copie approfondie. Comprendre la différence entre eux est crucial pour éviter les erreurs qui peuvent être difficiles à détecter.
Une copie superficielle copie uniquement le premier niveau d'un objet, laissant des références aux données d'origine à des niveaux plus profonds. Cela signifie que si l'objet d'origine contient d'autres objets (imbriqués), la copie superficielle copiera uniquement les références à ces objets, pas les objets eux-mêmes.
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]]
Une copie superficielle est utile lorsque vous savez que vous n'avez pas besoin de modifier les objets imbriqués. C'est plus rapide et consomme moins de mémoire qu'une copie complète.
En JavaScript, si vous utilisez Array.slice() ou Object.assign(), vous faites une copie superficielle !
Une copie approfondie copie tous les niveaux d'un objet, dupliquant même les structures imbriquées. Cela signifie que toute modification apportée à la copie n'affectera pas l'objet 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 vous travaillez avec des structures de données complexes ou imbriquées, la copie approfondie est l'option la plus sûre pour éviter les effets secondaires indésirables.
En Python, copy.deepcopy() est votre ami lorsque vous devez dupliquer en toute sécurité des objets complexes.
Voici une comparaison directe entre la copie superficielle et la copie profonde :
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!