affectation, copie superficielle ou copie profonde?

affectation de Variable

Il est dit dans la documentation Python que « les instructions D’affectation en Python ne copient pas d’objets, elles créent des liaisons entre une cible et un objet. »Cela signifie que lorsque nous créons une variable par affectation, la nouvelle variable fait référence au même objet que la variable d’origine —

>>> A = , 3, ]>>> B = A>>> id(A)
3061527080>>> id(B)
3061527080

car la nouvelle variable B et la variable d’origine A partagent le même objet, la même liste), elles contiennent également des mêmes éléments —

>>> id(A)
3061527368>>> id(B)
3061527368

Comme illustré dans la figure ci-dessous, A et B partager le même id, c’est à dire, ils font référence au même objet en mémoire. Et ils contiennent les mêmes éléments.,

Copie

Lorsque nous créons une variable par la copie superficielle, la nouvelle variable se réfère à un nouvel objet —

>>> A = , 3, ]>>> C = copy(A)>>> id(A)
3062428488>>> id(C)
3062428520

Bien que le A et C fait référence à deux objets différents (c’est à dire, deux listes avec des adresses mémoire différentes—, les éléments des deux listes se réfèrent aux mêmes objets –

>>> id(A)
2301696>>> id(C)
2301696>>> id(A)
3062464904>>> id(C)
3062464904

la figure ci-dessous illustre comment les éléments deAse réfèrent aux mêmes objets que les éléments deC.,>

copie profonde

semblable à la copie superficielle, lorsque nous créons une variable par copie profonde, la nouvelle variable fait référence à un nouvel objet —

>>> A = , 3, ]>>> D = deepcopy(A)>>> id(A)
3062727496>>> id(D)
3062428488

comme décrit dans la documentation Python —

la différence entre la copie superficielle et profonde n’est pertinente que pour les objets composés (objets qui contiennent d’autres objets, comme des listes ou des instances de classe):

– une copie superficielle construit un nouvel objet composé et y insère (dans la mesure du possible) des références aux objets trouvés dans,

– Une copie profonde construit un nouvel objet composé puis, récursivement, y insère des copies des objets trouvés dans l’original.

Si différent de la copie superficielle, les éléments dans les deux listes de référence à d’autres objets —

>>> id(A)
2301696>>> id(D)
2301696>>> id(A)
3062464648>>> id(D)
3062466376

Mais pourquoi ne A et D partager le même objet (c’est à dire avoir la même adresse mémoire)? Parce qu’ils font tous deux référence à des entiers, ce qui est l’une des trois exceptions dues à l’optimisation de la mémoire que nous avons mentionnées au début.,

la figure ci-dessous montre A Et D se réfèrent à deux listes différentes en mémoire, et les éléments dans A se réfèrent à des objets différents que les éléments dans D sauf à l’optimisation de la mémoire.

Résumé

Si il y en a un à emporter à partir de cet article, il doit être le tableau ci-dessous., L’affectation de Variable ne copie pas les objets, donc A Et B ont la même adresse mémoire et contiennent les mêmes éléments. La copie superficielle crée un nouvel objet pour le C, mais les éléments C font toujours référence aux mêmes objets que les éléments A. Deep copy crée également un nouvel objet pour D, et les éléments de D font référence à des objets différents de ceux de A avec trois types d’exceptions.,

Laisser un commentaire

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