2016-03-10 6 views
5

Ich habe Frage mit Methode Wörterbuch Kopie zum Beispiel können sagen, ich habePython Wörterbuch Kopiermethode

>> d = {'pears': 200, 'apples': 400, 'oranges': 500, 'bananas': 300} 

>> copy_dict = d.copy() 

Nun, wenn ich id überprüfen die sowohl d und copy_dict, die beide unterschiedlich sind

>> id(d) 
o/p = 140634603873176 

>> id(copy_dict) 
o/p = 140634603821328 

aber Wenn ich die ID von Objekten in den Wörterbüchern überprüfe, sind sie gleichbedeutend id (d ['Birnen]])

>> id(d['pears']) 
o/p = 140634603971648 
>> id (copy_dict['pears']) 
o/p = 140634603971648 

Alle Objekte im neuen dict sind Verweise auf dieselben Objekte wie das ursprüngliche dict.

Wenn ich jetzt den Wert des Schlüssels 'Birnen' in d ändere, gibt es keine Änderung in demselben Schlüssel in copy_dict und wenn ich die IDs jetzt überprüfe, id (d ['Birnen'])! = Id (copy_dict [ ‚Birnen‘])

>> d['pears'] = 700 
>> print copy_dict['pears'] 
o/p = 200 

Meine Frage ist, ob die Objekte in den neuen dict Verweise auf die gleichen Objekte wie das Original dict sind, warum der Wert des neuen dict ist nicht ändern, wenn der Wert in der ursprünglichen Wörterbuch wurde geändert und wie hat Python sofort die IDs geändert, sobald sich der Wert geändert hat?

Können Sie mir bitte eine vollständige Beschreibung des Unterschieds zwischen tiefer und seichter Kopie geben?

+0

Mögliche Duplikate von [Understanding dict.copy() - flach oder tief?] (Http://stackoverflow.com/questions/3975376/understanding-dict-copy-shallow-oder-deep) – Backtrack

Antwort

2

Indem Sie den Wert ändern, ändern Sie, worauf der Schlüssel zeigt. Durch Ändern des Werts im ursprünglichen Wörterbuch wird nicht geändert, worauf der Schlüssel in der Kopie verweist.

Eine flache Kopie erstellt ein neues zusammengesetztes Objekt und dann (zum soweit möglich) fügt Referenzen in sie zu den in gefundenen Objekte das Original.

Eine tiefe Kopie erstellt ein neues zusammengesetztes Objekt und fügt dann rekursiv Kopien der Objekte ein, die in dem Original gefunden werden.

Wenn Sie etwas kopieren, kopiert es die ursprünglichen Werte des Objekts, das es kopiert, aber es erstellt ein neues Objekt. Es spiegelt nicht das ursprüngliche Objekt.

+0

Aber wenn wir etwas kopieren die Objekte in dem neuen dict sind Verweise auf die gleichen Objekte wie die ursprüngliche dict-Bedeutung, beide Adressen sind gleich, was Aliasing ist, also sollten die an einem vorgenommenen Änderungen auch das neue dict-Recht ändern? da beide auf dieselbe Adresse zeigen. – sans0909

+0

nein, mit copy() erstellen Sie ein neues Objekt. Sie würden den Zuweisungsoperator für das verwenden, was Sie versuchen zu tun: 'copy_dict = d', dann, wenn Sie' d' aktualisieren, wird auch das 'copy_dict' aktualisiert, weil sie das gleiche Objekt sind. – lciamp

+0

danke @lciamp – sans0909

0

Der Grund ist, dass Sie eine Zuweisungsoperation ausgeführt haben, die Werte ersetzt, keine Wertmodifikationsoperation.

copy_dict = d.copy() 

ein neues dict verursacht von d erstellt und seine Schlüssel/Werte wurden initialisiert werden. Sie haben den wichtigen Punkt notiert - das sind separate Objekte mit unterschiedlichen IDs, die zufällig auf die gleichen Schlüssel und Werte verweisen.

d['pears'] = 700 

entfernt die Referenz auf 200 von d['pears'] und eine Referenz auf 700 hinzugefügt. Diese Neuzuweisung wurde an dem Objekt d selbst vorgenommen, so dass es natürlich von anderen Diktaten nicht gesehen würde, die einfach mit den gleichen Schlüsseln und Werten initialisiert wurden.

Im Gegensatz dazu angenommen hatte man einfach die ursprüngliche dict zu einer zweiten Variable

copy_dict = d 

da beide d Hier zugeordnet und copy_dict Referenz die gleiche dict, Neuzuweisung an diesem dict würde von beiden Variablen, weil sie gesehen werden referenziere das gleiche Objekt.

+0

Vielen Dank, es ist jetzt klar :-) – sans0909