Dans le monde de la programmation, la copie de 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 les 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. Elle 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 effectuez 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 d'origine.
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 approfondie :
Fonctionnalité | Copie superficielle | Copie approfondie |
---|---|---|
Copie superficielle | Ouais | Non |
Copie complète | Non | Ouais |
Les modifications apportées à l'objet d'origine affectent la copie | Ouais | Non |
Complexité | Faible | Haut |
N'oubliez pas qu'une copie superficielle est plus rapide, mais une copie approfondie est plus sûre lorsque vous travaillez avec des objets complexes.
Les copies superficielles sont idéales pour dupliquer des paramètres d'application légers ou des données temporaires !
Une erreur courante consiste à utiliser une copie superficielle au lieu d'une copie complète lorsque les données sont imbriquées. Cela peut entraîner des modifications indésirables de l'objet d'origine.
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)
Vérifiez toujours si votre objet a des niveaux imbriqués avant de choisir entre une copie superficielle ou profonde.
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() est parfait pour copier des structures complexes ou circulaires sans se casser la tête.
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, une copie superficielle suffit parfois pour éviter des modifications accidentelles de vos listes !
En résumé, les copies superficielles et les copies profondes ont leur utilité. La clé est de comprendre la structure des données avec lesquelles vous travaillez et de choisir la méthode de copie appropriée.
Oui, car il copie moins de données.
Oui, avec JSON.parse(JSON.stringify()) ou structuredClone().
L'objet d'origine sera également affecté.
Pas nécessairement, uniquement lorsque vous travaillez avec des structures de données complexes.
Il est natif, prend en charge les structures circulaires et est plus efficace que JSON.parse(JSON.stringify()), en plus de permettre le transfert complet des valeurs d'un objet à un autre.
Les erreurs lors de l'utilisation de copies superficielles au lieu de copies profondes sont plus courantes que vous ne le pensez ! J'espère que ce petit guide vous aidera à éviter tout problème lors de la copie de données.
Faites-moi savoir dans les commentaires, connaissiez-vous déjà les copies profondes et superficielles et avez-vous déjà eu un problème à cause d'elles ?
Photo de Mohammad Rahmani sur Unsplash
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3