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']}
So für den Schlüssel
"machines"
in dictd
, wenn tiefe Kopie verwenden, wird Python eine neue Liste Objekt erstellen, die auf der Liste ist anders Objekt in dictc
.Aber wenn flache Kopie verwendet wird, gibt es nur ein Listenobjekt und beide Wörterbücher zeigen darauf.
Was mehr ist, wenn ich flache Kopie für Objekte wie Tuple und Str verwende, erstellt es ein neues Objekt.
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?
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
danke, ich habe es jetzt verstanden! – RuiCao