2017-03-26 2 views
0

Betrachten Sie die folgendeWenn ein Schlüssel einen Listenwert hat, tiefe Kopie und flache Kopie verwendet werden einige Unterschiede

from copy import deepcopy 
c = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']} 
dc = c.copy() 
d = deepcopy(dc) 
d['username'] = 'mln' 
d['machines'].remove('bar') 
print d 
print c 

das Ergebnis haben, ist wie folgt:

{'username': 'mln', 'machines': ['foo', 'baz']} 
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']} 

aber als flache Kopie verwenden, die Dinge werden anders sein.

a = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']} 
b = a.copy() 
b['username']='mln' 
b['machines'].remove('bar') 
print b 
print a 

das Ergebnis ist wie folgt:

{'username': 'mln', 'machines': ['foo', 'baz']} 
{'username': 'admin', 'machines': ['foo', 'baz']} 
  1. So für den Schlüssel "machines" in dict d, wenn tiefe Kopie verwenden, wird Python eine neue Liste Objekt erstellen, die auf der Liste ist anders Objekt in dict c.

  2. Aber wenn flache Kopie verwendet wird, gibt es nur ein Listenobjekt und beide Wörterbücher zeigen darauf.

  3. Was mehr ist, wenn ich flache Kopie für Objekte wie Tuple und Str verwende, erstellt es ein neues Objekt.

  4. Aber für Wörterbuch und Liste, es fügt nur eine weitere Referenz hinzu. Wenn Sie die Tiefenkopie verwenden, erstellen Sie beide ein neues Objekt.

Bin ich richtig?

Antwort

0

Aus der Dokumentation:

Der Unterschied zwischen flachen und tiefen Kopieren nur für zusammengesetzte Objekte (Objekte, die andere Objekte enthalten, wie Listen oder Klasseninstanzen) relevant ist:

1.A flache Kopie Erstellt ein neues zusammengesetztes Objekt und fügt dann (soweit möglich) Referenzen in die Objekte ein, die in Original gefunden wurden.

2. Eine tiefe Kopie erstellt ein neues zusammengesetztes Objekt und fügt dann rekursiv Kopien der Objekte in das Original ein.

so ..

  1. ja
  2. ja
  3. Nein Wenn Sie flache Kopie verwenden, für Streich- und tuple es nicht ein neues Objekt erstellen. ex:
>>> s1 = "string1" 
>>> s2 = copy.copy(s1) 
>>> id(s2) == id(s1) 
True 
>>> id(s2[0]) == id(s1[0]) 
True 

beide verweisen auf gleiche Objekt ..!

  1. Ja, wenn wir Deep Copy verwenden, werden neue Objekte für Wörterbücher und Listen erstellt, da sie zusammengesetzte Objekte sind.

Check diesen Link für weitere Informationen: What exactly is the difference between shallow copy, deepcopy and normal assignment operation?

+1

zusätzlich zu dem, was sagt @valacmur, beachten Sie, dass in der Zeile 'b [ 'username'] =' mln'' erstellen Sie ein, sich neu verweisen, deshalb ist es nicht das selbe nach dem druck – Elisha

+0

danke, ich habe es jetzt verstanden! – RuiCao

Verwandte Themen