"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Copie superficielle ou copie approfondie : que sont-elles réellement ? - Exemples avec JavaScript et Python

Copie superficielle ou copie approfondie : que sont-elles réellement ? - Exemples avec JavaScript et Python

Publié le 2024-08-31
Parcourir:720

Introduction

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.

Qu'est-ce qu'une copie superficielle ?

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.

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

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

Conseil:

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.

Note:

En JavaScript, si vous utilisez Array.slice() ou Object.assign(), vous effectuez une copie superficielle !

Qu'est-ce qu'une copie approfondie ?

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.

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

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

Conseil:

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.

Note:

En Python, copy.deepcopy() est votre ami lorsque vous devez dupliquer en toute sécurité des objets complexes.

Comparaison directe : copie superficielle et copie approfondie

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

Conseil:

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.

Cas d'utilisation courants

Quand utiliser la copie superficielle

  • Lorsque vous travaillez avec des objets ou des structures de données simples.
  • Lorsque vous avez besoin d'améliorer les performances et que des modifications profondes ne sont pas un problème.
  • Exemples : configurations d'applications, mise en miroir temporaire des données.

Quand utiliser la copie approfondie

  • Lorsque vous travaillez avec des structures de données imbriquées ou complexes.
  • Lorsque vous devez vous assurer que les modifications apportées à la copie n'affectent pas l'original.
  • Exemples : manipulation de données complexes, applications nécessitant une sécurité et une cohérence élevées.

Note:

Les copies superficielles sont idéales pour dupliquer des paramètres d'application légers ou des données temporaires !

Problèmes courants et comment les éviter

Problèmes avec la copie superficielle

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.

Exemple:

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

shallowCopy[2][0] = 99;

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

Conseil:

Vérifiez toujours si votre objet a des niveaux imbriqués avant de choisir entre une copie superficielle ou profonde.

Outils et fonctions pour faire des copies en JavaScript

Utilisation de Object.assign() pour une copie superficielle

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

Utilisation de ...spread pour une copie superficielle

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

Utilisation de structuredClone() pour Deep Copy

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

Conseil:

structuredClone() est parfait pour copier des structures complexes ou circulaires sans se casser la tête.

Utiliser des bibliothèques comme Lodash pour Deep Copy

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

Outils et fonctions pour faire des copies en Python

Utilisation du module de copie

import copy

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

Différences entre copy.copy() et copy.deepcopy()

  • copy.copy() : copie superficielle.
  • copy.deepcopy() : copie approfondie.

Note:

En Python, une copie superficielle suffit parfois pour éviter des modifications accidentelles de vos listes !

Résumé et conclusion

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.

FAQ

1. La copie superficielle est-elle toujours plus rapide que la copie approfondie ?

Oui, car il copie moins de données.

2. Pouvez-vous effectuer une copie complète sans bibliothèques externes en JavaScript ?

Oui, avec JSON.parse(JSON.stringify()) ou structuredClone().

3. Que se passe-t-il si j'essaie de modifier un objet imbriqué dans une copie superficielle ?

L'objet d'origine sera également affecté.

4. Est-il préférable de toujours utiliser la copie approfondie pour éviter les problèmes ?

Pas nécessairement, uniquement lorsque vous travaillez avec des structures de données complexes.

5. Quels sont les avantages de structuredClone() par rapport aux autres méthodes de copie approfondie en JavaScript ?

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 ?


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

Le carnet de BYXN ? | Sous-pile

Mon carnet public ! ???. Cliquez pour lire le carnet de BYXN ?, une publication Substack. Lancé il y a 17 jours.

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

Photo de Mohammad Rahmani sur Unsplash

Déclaration de sortie Cet article est reproduit sur : https://dev.to/bhyxen/shallow-copy-vs-deep-copy-que-son-realmente-ejemplos-con-javascript-y-python-10ja?1 En cas de contrefaçon , veuillez contacter study_golang @163.comdelete
Dernier tutoriel Plus>

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