Maison >développement back-end >Tutoriel Python >Copie superficielle et copie profonde en python
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
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.
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])
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
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.
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])
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.
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])
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 !