-1
votes

Pourquoi la copie du dictionnaire d'origine change-t-elle lors de l'annexe d'origine et de la suppression de l'original?

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: xxx

Ceci renvoie la sortie comme xxx

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 () ?


3 commentaires

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 Les objets ont une méthode Copier si vous souhaitez les copier, ou vous pouvez simplement faire d2 = dict (d1) . Remarque, d2 = {} avant complètement inutile.


3 Réponses :


0
votes

Utiliser .Copopy () Pour créer une (copie peu profonde) de D1, comme: xxx

sorties:

{'A': '1'}

La raison du code d'origine ne fonctionnait pas comme prévu que D1 et D2 indiquaient sur le même objet.


0 commentaires

0
votes

En attribuant d2 = d1 , 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.

Ce n'est pas une copie que vous n'écrez que le nombre de références par un. En utilisant del d1 , vous décrémentez le nombre de références par un, mais d2 est toujours sur la même valeur en mémoire.

Pour créer une copie où ils sont tous deux des entités distinctes, utilisez d2 = d1.copy () . .


2 commentaires

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.



1
votes

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) xxx


0 commentaires