Maison >développement back-end >Tutoriel Python >Questions fréquentes d'entretien Python : copie superficielle et copie approfondie

Questions fréquentes d'entretien Python : copie superficielle et copie approfondie

WBOY
WBOYavant
2023-04-12 11:37:051809parcourir

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 !

Affectation de variable

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 superficielle

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 ?

Copie approfondie

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.

Résumé de la copie superficielle et de la copie profonde

Pas grand chose à dire, utilisez simplement deux images pour l'expliquer simplement :

Copie superficielle, comme indiqué ci-dessous :

Questions fréquentes dentretien Python : copie superficielle et copie approfondie

Copie approfondie, comme indiqué ci-dessous :


Questions fréquentes dentretien Python : copie superficielle et copie approfondie

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer