Maison >développement back-end >Tutoriel Python >Copie superficielle et copie profonde en python

Copie superficielle et copie profonde en python

高洛峰
高洛峰original
2017-03-02 15:56:041361parcourir

Avant de parler de ce qu'est la copie profonde et superficielle, examinons d'abord ce phénomène :

a = ['scolia', 123, [], ]
b = a[:]
b[2].append(666)
print a
print b

Copie superficielle et copie profonde en python

Pourquoi est-ce que je modifie uniquement b, mais cela affecte a ? J'ai vu ce que j'ai dit dans mon article précédent : toutes les références mémoire sont stockées dans la séquence.

Copie superficielle et copie profonde en python

Ainsi, lorsque nous modifions la liste vide à l'intérieur via b, nous modifions en fait le même objet dans la mémoire, donc cela affectera a.

a = ['scolia', 123, [], ]
b = a[:]
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

Copie superficielle et copie profonde en python

Le code est vérifié correctement, donc bien que a et b soient deux objets différents, les références à l'intérieur sont tout de même. C'est ce qu'on appelle le nouvel objet, l'ancien contenu.

Cependant, une copie superficielle n'est pas seulement cela, regardez ci-dessous :

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print a
print b

Copie superficielle et copie profonde en python

C'est encore une fois Que se passe-t-il ?

Les étudiants qui ont lu mes instructions sur l'affectation de variables en python le sauront : pour les types de données immuables tels que les chaînes et les nombres, la modification équivaut à une réaffectation. Ici, cela équivaut à rafraîchir la référence.

Copie superficielle et copie profonde en python

Vérifiez le code :

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

Copie superficielle et copie profonde en python

Regardez Viens, c'est vrai.

Ce dont nous avons parlé ci-dessus est une copie superficielle. Pour résumer, la copie superficielle copie simplement une série de références. Lorsque nous modifions le type de données modifiable de l'objet copié, les références ne sont pas modifiées, donc cela affectera le. objet original. Lors de la modification d'un objet non modifiable, un nouvel objet est créé et la référence est actualisée. Par conséquent, la référence à l'objet d'origine est différente et le résultat est différent.

Comment créer une copie superficielle :

Opération de découpage

2. pour créer un nouvel objet. ( b = list(a) )

La copie approfondie signifie donc recréer les objets référencés à l'intérieur et générer une nouvelle série de références.

En gros, c'est comme ça, mais pour les objets non modifiables tels que les chaînes et les nombres, cela semble un peu inutile de créer une nouvelle copie. Quoi qu'il en soit, lorsque vous souhaitez la modifier, vous créerez un nouvel objet et. rafraîchir la référence de. Peu importe si vous utilisez toujours la référence d'origine, vous pouvez également atteindre l'objectif d'économiser de la mémoire.

Copie superficielle et copie profonde en python

Regardez la vérification du code :

from copy import deepcopy
a = ['scolia', 123, [], ]
b = deepcopy(a)
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

Copie superficielle et copie profonde en python

Vérifié correctement.

Création d'une copie profonde :

1 Comme utilisé dans l'exemple de code, il ne peut être créé que via la méthode deepcopy() de. le module de copie intégré.

D'accord, arrêtons de parler ici des problèmes de copie sombre et superficielle. S'il y a des erreurs ou s'il faut les ajouter, nous continuerons plus tard.

L'article ci-dessus sur la compréhension approfondie de la copie superficielle et de la copie profonde en Python est tout le contenu partagé par l'éditeur. J'espère qu'il pourra vous donner une référence, et j'espère également que tout le monde le fera. prend en charge le site Web PHP chinois.

Pour plus d'articles sur la copie superficielle et la copie profonde en python, veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn