Donc, fondamentalement, je sais que la copie peu profonde et la copie profonde varie.
Ce que j'essaie de comprendre est que lorsque je fais une copie directe: Ceci renvoie la sortie comme p> ma question est pourquoi Est-ce que cela se produit et que puis-je faire pour ne pas laisser cela arriver? Je ne veux pas que D2 change une fois que je fais la copie. Y a-t-il un moyen de le faire sans utiliser copy.deepcopy () code>? P> p>
3 Réponses :
Utiliser .Copopy () Pour créer une (copie peu profonde) de D1, comme: sorties: p> {'A': '1'} p> La raison du code d'origine ne fonctionnait pas comme prévu que D1 et D2 indiquaient sur le même objet. P> p>
En attribuant Ce n'est pas une copie que vous n'écrez que le nombre de références par un. En utilisant Pour créer une copie où ils sont tous deux des entités distinctes, utilisez d2 = d1 code>, ils pointent tous les deux sur la même variable en mémoire. Vous pouvez modifier cette valeur avec votre nom car ils pointent tous les deux vers la même chose. P>
del d1 code>, vous décrémentez le nombre de références par un, mais
d2 code> est toujours sur la même valeur en mémoire. P>
d2 = d1.copy () code>. p>.
Donc, si je supprime les deux références D1 et D2, qu'advient-il de cet emplacement de mémoire? Est-ce que cela stocke toujours le même dictionnaire, mais sans aucune référence à un autre objet là-bas? Est-ce ce que nous avons généralement des valeurs de déchets?
Il y a un collecteur ordures qui fonctionne en arrière-plan et efface les objets sans nombre de référence.
Non, vous ne pouvez pas copier un objet comme celui-ci, lorsque vous dites D2 = D1, vous ne faites pas une copie de D1, il en résulte D2 d'être un autre nom pour D1. Si vous ne voulez pas qu'il met à jour "B": "2" utilise dict (d1)
Vous ne faites jamais une copie nulle part dans le code ci-dessus, ni peu profond ni profond.
Vous devriez vraiment lire ce qui suit: Nedbatchelder.com/text/names.html
Le duplicata lié concerne les listes, mais les mêmes principes s'appliquent.
DICT CODE> Les objets ont une méthode code> Copier code> si vous souhaitez les copier, ou vous pouvez simplement faire
d2 = dict (d1) code>. Remarque,
d2 = {} code> avant complètement inutile.