Comprendre la copie superficielle et la copie profonde en Python

Python propose plusieurs approches efficaces pour gérer les données. Il est essentiel de comprendre les concepts de copie superficielle et de copie profonde lorsque l’on travaille avec des structures de données telles que des listes imbriquées, des dictionnaires ou des objets personnalisés.

La copie superficielle et la copie profonde permettent toutes deux de créer des répliques de structures de données, mais elles agissent différemment en ce qui concerne les données imbriquées.

Utilisation de la copie superficielle

La copie superficielle fonctionne en créant une copie de la structure de premier niveau de l’objet original. Cela signifie que, si l’objet original contient des objets imbriqués, la copie référencera les mêmes objets imbriqués que l’original. En d’autres termes, la copie superficielle d’un objet duplique sa structure externe, et non les objets imbriqués qu’il peut contenir.

Pour effectuer une copie superficielle en Python, vous pouvez utiliser la fonction copy() du module copy ou la fonction . copy() sur l’objet.

Prenons un exemple de travail avec une liste ou un dictionnaire en Python.

Dans le code ci-dessus, la méthode liste_principale contient une liste d’entiers et une liste intérieure (objet imbriqué) contenant des lettres. La fonction copy crée une copie de la variable liste_principale que le code stocke dans une autre variable, shallow_copy.

Toute modification apportée à la variable copie peu profonde aura également une incidence directe sur la liste imbriquée liste_principale et vice versa. Ces changements montrent que la liste imbriquée ou intérieure de la liste copie_inférieure n’est qu’une référence à la liste interne de la shallow_copy liste_principale ce qui fait que les changements s’appliquent à liste_principale aussi.

Voir aussi :  GitHub vs GitLab : qu'est-ce qui vous convient le mieux ?

Pendant ce temps, toute modification apportée aux éléments extérieurs (les entiers) dans l’une ou l’autre des deux listes shallow_copy soit dans liste_principale n’affectera que cette instance. Ces éléments extérieurs sont des valeurs indépendantes à part entière, et non de simples références.

La sortie montre que les deux éléments extérieurs de la liste sont indépendants l’un de l’autre :

La même idée s’applique lorsque l’on travaille avec des dictionnaires.

Les modifications apportées au dictionnaire imbriqué de dict1 affectent à la fois dict1 et dict2. Dans le même temps, les modifications apportées aux éléments extérieurs de dict1 n’affectent que celui-ci.

Utilisation de la copie en profondeur

Au lieu de référencer les objets imbriqués de la copie originale, une copie profonde fait une copie entièrement séparée de l’objet original et de ses objets imbriqués. Modifier la copie profonde n’affectera pas l’objet original et vice versa ; il s’agit véritablement de valeurs distinctes.

Pour effectuer une copie profonde en Python, utilisez la commande deepcopy() du module copy.

Prenons un exemple d’utilisation d’une liste.

Ici, le code effectue une copie profonde de liste_principale créant ainsi une copie indépendante nommée copie_profonde.

Lorsque vous modifiez la liste imbriquée ou les éléments extérieurs dans le fichier copie_profonde vos modifications n’affectent pas la liste originale, et vice versa. Cela prouve que la liste imbriquée ou les éléments extérieurs ne sont pas partagés entre les deux copies.

Travailler avec des objets personnalisés

Vous pouvez créer un objet personnalisé en définissant une classe Python et en créant une instance de la classe.

Voir aussi :  Comment valider une URL à l'aide d'expressions régulières

Voici un exemple de création d’un objet simple à partir d’une classe Python Livre classe :

Maintenant, faites une copie superficielle et une copie profonde d’une instance de cette classe Livre à l’aide de la fonction copie module.

Comme vous pouvez le constater, la copie superficielle (livre2) est un nouvel objet, mais elle fait référence au même objet interne (liste d’auteurs) que l’objet original (livre1). Par conséquent, une modification des auteurs de l’objet original affecte les deux instances (book1 et book2), tandis qu’une modification de l’objet externe (prix) n’affecte que l’objet original (livre1).

En revanche, la réalisation d’une copie profonde crée une copie indépendante de l’objet original, y compris des copies de tous les objets qu’il contient.

Dans ce cas, la copie profonde (livre2) est un objet complètement indépendant, et la modification de l’objet original (livre1) ne l’affecte pas.

Utilisations de la copie superficielle et de la copie profonde

Il est essentiel de comprendre les notions de copie profonde et de copie superficielle afin de pouvoir choisir l’approche appropriée pour manipuler les données. Voici quelques scénarios dans lesquels chaque méthode est applicable :

  • Utilisez une copie superficielle si vous souhaitez répliquer un objet complexe sans générer de nouvelles instances de ses objets imbriqués. Cette approche est plus efficace en termes de mémoire et plus rapide que la copie profonde, car elle ne duplique pas les objets imbriqués.
  • Utilisez une copie superficielle pour créer un instantané de l’état d’un objet tout en partageant certaines données sous-jacentes entre l’objet original et l’objet copié.
  • Utilisez une copie profonde si vous souhaitez modifier une réplique d’un objet sans avoir d’impact sur l’original. Cela génère des copies indépendantes d’objets imbriqués, garantissant que toute modification apportée à la copie ne s’applique pas à l’original.
  • La copie profonde est essentielle lorsque vous avez besoin de copies indépendantes de structures de données imbriquées, principalement lorsque vous traitez des hiérarchies d’objets récursives ou complexes.
Voir aussi :  Comment implémenter des arrière-plans déroulants dans Pygame

Performances et considérations

Étant donné que la copie superficielle ne génère pas de nouvelles instances d’objets imbriqués, elle s’exécute généralement plus rapidement et utilise moins de mémoire que la copie profonde. Cependant, l’original et la copie superficielle peuvent avoir des effets secondaires indésirables en raison de la modification d’éléments internes partagés.

En particulier pour les structures de données volumineuses et profondément imbriquées, la copie profonde, une procédure récursive, peut être plus lente et utiliser plus de mémoire. Cependant, elle garantit une indépendance totale entre l’original et la copie profonde, ce qui rend la manipulation de données complexes plus sûre.

La meilleure option de copie pour vos données

De nombreux langages de programmation utilisent le concept de copie superficielle et profonde. Comprendre ce concept vous permet de manipuler des données sans conséquences imprévues.

En utilisant les techniques de copie superficielle et profonde, vous pouvez choisir la meilleure approche pour dupliquer vos structures de données en toute sécurité. En comprenant les effets sur vos données, vous obtiendrez des résultats plus fiables et prévisibles de votre code.

Cliquez pour évaluer cet article !
[Total: Moyenne : ]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *