Maison >développement back-end >Tutoriel Python >Questions fréquentes d'entretien Python : copie superficielle et copie approfondie
Dans les entretiens Python, la copie superficielle et la copie profonde sont une question relativement difficile. Soixante pour cent des personnes n'ont jamais entendu parler de la copie superficielle et de la copie profonde, et 30 % des personnes ne comprennent que les concepts de base et les différences simples entre les deux. Seul moins d’un adulte peut faire avec précision la différence entre les deux et terminer l’écriture des démos de code pertinentes ! Résolvons cette difficulté aujourd'hui et ajoutons du poids à la promotion à l'entretien ! Cet article est probablement l'article le plus facile à comprendre sur tout Internet qui explique la copie superficielle et la copie approfondie. Tant que vous suivez les exemples de l'article et que vous pratiquez, vous comprendrez certainement les difficultés techniques de ce qu'est une copie superficielle et une copie profonde. les copies sont !
Dans les types de données variables Python (liste, dictionnaire, ensemble), attribuez une variable de type de données variable à une autre variable. Les deux variables font référence au même objet et l'adresse mémoire est la même. Oui, si une variable est. modifiée, l’autre variable sera modifiée en conséquence. Si vous souhaitez connaître les détails techniques des types de données mutables et des types de données immuables en python, veuillez lire l'article :Questions fréquemment posées dans les entretiens Python : la différence entre les types de données mutables et les types de données immuables.
Prenons un exemple de mon article précédent.
l1=['a','b','c'] l2=l1 print(id(l1)) print(id(l2)) l2.append('d') print("************") print(id(l1)) print(l1) print(id(l2)) print(l2) 输出: 838366483528 838366483528 ************ 838366483528 ['a', 'b', 'c', 'd'] 838366483528 ['a', 'b', 'c', 'd']
Les résultats de sortie ne seront pas expliqués ici. Les adresses de l1 et l2 sont les mêmes, elles s'influenceront donc mutuellement.
copie le niveau supérieur d'un objet et copie uniquement la "référence" de l'objet.
Prenons un exemple de l'article précédent. Il n'y a qu'un seul calque dans la liste, c'est-à-dire que l'élément ne contient pas d'autres listes.
l3=['x','y','z'] l4=list(l3) print(id(l3)) print(id(l4)) l4.append('a') print(l3) print(l4) 输出 831456302152 831480344136 ['x', 'y', 'z'] ['x', 'y', 'z', 'a']
Comme vous pouvez le voir sur les résultats, les adresses de l3 et l4 sont différentes, elles ne s'affecteront donc pas.
Prenons un autre exemple et laissez le premier élément de l3 être une liste.
l3=[['x','y','z'],'a','b'] l4=list(l3) print(id(l3)) print(id(l4)) l4.append('c') print(l3) print(l4) 结果 533336249416 533337391240 [['x', 'y', 'z'], 'a', 'b'] [['x', 'y', 'z'], 'a', 'b', 'c']
Le résultat est exactement comme prévu, car le premier élément est une liste, donc il a aussi une adresse, et nous l'imprimons.
print(id(l3[0])) print(id(l4[0])) 结果 533336248904 533336248904
Nous avons constaté que les adresses de l3[0] et l4[0] sont en fait les mêmes, puis exécutons le code suivant.
l3[0].append('yy') print(l3) print(l4) 结果 [['x', 'y', 'z', 'yy'], 'a', 'b'] [['x', 'y', 'z', 'yy'], 'a', 'b', 'c']
Les résultats sont conformes aux attentes. La modification de la valeur de l3[0] affecte également l4[0]. Alors, que pouvons-nous faire pour empêcher l3[0] et l4[0] de s'influencer mutuellement ? Cela nécessite l'introduction de copies profondes ?
La copie approfondie copie chaque calque de l'objet. L'objet copié est complètement indépendant de l'objet d'origine et n'a aucune relation. Pour implémenter la copie profonde, vous devez utiliser la méthode deepcopy dans le module de copie.
import copy l3=[['x','y','z'],'a','b'] #l4=list(l3) #浅拷贝,使用=copy.copy(l3)也可以实现浅拷贝 l4=copy.deepcopy(l3) #深拷贝 l4.append('c') print(id(l3[0])) print(id(l4[0])) l3[0].append('yy') print(l3) print(l4) 输出 407168435784 407166887304 [['x', 'y', 'z', 'yy'], 'a', 'b'] [['x', 'y', 'z'], 'a', 'b', 'c']
Vous pouvez voir que l3[0] et l4[0] sont complètement indépendants et n'ont aucune influence l'un sur l'autre.
Pas grand chose à dire, utilisez simplement deux images pour l'expliquer simplement :
Copie superficielle, comme indiqué ci-dessous :
Copie approfondie, comme indiqué ci-dessous :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!