Chapitre Précédent: Sets and Frozen Sets
chapitre suivant: Functions

shallow and Deep Copy

Introduction


Comme nous l’avons vu dans le chapitre « Data Types and Variables », Python a un comportement étrange – en comparaison avec d’autres langages de programmation – types comme les entiers et les chaînes. La différence entre la copie superficielle et profonde n’est pertinente que pour les objets composés, qui sont des objets contenant d’autres objets, comme des listes ou des instances de classe.,
dans l’extrait de code suivant, y pointe vers le même emplacement de mémoire que X. Cela change, lorsque nous attribuons une valeur différente à Y. dans ce cas, y recevra un emplacement de mémoire séparé, comme nous l’avons vu dans le chapitre « types de données et Variables ».

>>> x = 3>>> y = x

mais même si ce comportement interne semble étrange par rapport aux langages de programmation comme C, C++ et Perl, les résultats observables des affectations répondent à nos attentes. Mais cela peut être problématique, si nous copions des objets mutables comme des listes et des dictionnaires.
Python ne crée de vraies copies que s’il le faut, c’est-à-dire, si l’utilisateur, le programmeur, explicitement l’exige.
Nous allons vous présenter les problèmes les plus cruciaux, qui peuvent survenir lors de la copie d’objets mutables, c’est-à-dire lors de la copie de listes et de dictionnaires.

la Copie d’une liste

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

Dans l’exemple ci-dessus une liste simple est attribué à colours1. Dans l’étape suivante, nous attribuons colour1 à colours2. Après cela, une nouvelle liste est affectée à colours2.
comme nous nous y attendions, les valeurs des couleurs1 sont restées inchangées., Comme c’était le cas dans notre exempledans le chapitre « types de données et variables », un nouvel emplacement mémoire avait été alloué pour colours2, car nous avons attribué une nouvelle liste complète à cette variable.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

mais la question Est, que se passera-t-il si nous changeons un élément de la liste des colours2 ou colours1?
dans l’exemple ci-dessus, nous attribuons une nouvelle valeur au deuxième élément de colours2. Beaucoup de débutants seront étonnés que la liste des couleurs1 ait également été » automatiquement  » modifiée.,
l’explication est qu’il n’y a pas eu de nouvelle affectation à colours2, seulement à un de ses éléments.

Copier avec L’opérateur Slice

Il est possible de copier complètement des structures de liste superficielles avec l’opérateur slice sans avoir aucun des effets secondaires, que nous avons décrits ci-dessus:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

mais dès qu’une liste contient des sous-listes, nous avons la même difficulté, c’est-à-dire,

>>> lst1 = ]>>> lst2 = lst1

Ce comportement est représenté dans le schéma suivant:

Si vous assigner une nouvelle valeur à l’0e Élément de l’une des deux listes, il n’y aura aucun effets secondaires. Des problèmes surviennent, si vous modifiez l’un des éléments de la sous-liste.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

le schéma suivant illustre ce qui se passe si l’un des éléments d’une sous-liste est modifié: le contenu de lst1 et lst2 sont modifiés.,

en Utilisant la Méthode propriétédeepcopy à partir du Module de copie

Une solution pour les problèmes décrits est d’utiliser le module « copier ». Ce module fournit la méthode « copy », qui permet une copie complète d’une liste arbitraire, c’est-à-dire des listes superficielles et autres.
Le script suivant utilise notre exemple ci-dessus, et cette méthode:

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

Si nous enregistrer ce script sous le nom de deep_copy.py et si nous appeler le script avec « python deep_copy.,py », nous aurons le résultat suivant:

$ python deep_copy.py ]]

Chapitre Précédent: Jeux et Congelés Ensembles
Prochain Chapitre: Fonctions

Laisser un commentaire

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