So kopieren Sie ein Wörterbuch und bearbeiten nur die Kopie
Kann mir bitte jemand erklären mir das an? Dies macht keinen Sinn für mich.
Kopiere ich ein Wörterbuch, in einem anderen, und Bearbeiten Sie den zweiten, und beide sind geändert. Warum ist das passiert?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2
{'key2': 'value2', 'key1': 'value1'}
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}
InformationsquelleAutor der Frage MadSc13ntist | 2010-03-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python nie implizit kopiert Objekte. Wenn Sie
dict2 = dict1
Sie machen Sie sich auf die gleiche genaue dict-Objekt, so, wenn Sie mutieren, werden alle Verweise auf Sie halten, bezogen auf das Objekt in seinem aktuellen Zustand.Wenn Sie kopieren möchten, dict (was selten ist), Sie müssen so tun, explizit mit
oder
InformationsquelleAutor der Antwort Mike Graham
Beim zuweisen
dict2 = dict1
Sie sind nicht eine Kopiedict1
es Ergebnisse indict2
nur ein anderer name fürdict1
.Kopieren der veränderlichen Arten wie Wörterbücher, Nutzung
copy
/deepcopy
descopy
Modul.InformationsquelleAutor der Antwort Imran
InformationsquelleAutor der Antwort gpanda
Können Sie auch einfach eine neue dictionary-mit einem Wörterbuch Verständnis. Dies vermeidet den Import kopieren.
Natürlich in python >= 2.7, die Sie tun können:
Aber für die Rückwärtskompatibilität mit vorhandenen., die top-Methode besser.
InformationsquelleAutor der Antwort Dashing Adam Hughes
Auf python 3.5+ es ist ein einfacher Weg, das zu erreichen eine flache Kopie durch Verwendung von ** Auspacken Betreiber. Definiert durch Pep 448.
** unpackages das Wörterbuch, in ein neues Wörterbuch, das wird dann zugewiesen dict2.
Können wir auch bestätigen, dass jedes Wörterbuch hat eine eindeutige id.
Wenn eine Tiefe Kopie benötigt, dann kopieren.deepcopy() ist immer noch der Weg zu gehen.
InformationsquelleAutor der Antwort PabTorre
Zuweisung-Anweisungen in Python keine Objekte kopieren, schaffen Sie Bindungen zwischen einem Ziel und Objekt.
so,
dict2 = dict1
es ergibt sich eine Bindung zwischendict2
und das Objekt, dasdict1
finden.wenn Sie kopieren möchten, ein dict, können Sie die
copy module
.Das copy-Modul hat zwei Schnittstellen:
Den Unterschied zwischen flachen und tiefen Vervielfältigung ist nur relevant für zusammengesetzte Objekte (Objekte, die andere Objekte enthalten, wie Listen oder Klassen-Instanzen):
Einen flache Kopie erstellt ein neues compound-Objekt und dann (soweit möglich) Beilagen verweist, in der es um die Objekte im original gefunden.
Einen Tiefe Kopie erstellt ein neues compound-Objekt und dann rekursiv, fügt Kopien in es der die Objekte im original gefunden.
Beispielsweise in python 2.7.9:
und das Ergebnis ist:
InformationsquelleAutor der Antwort loosen
Können Sie kopieren und Bearbeiten der neu errichteten kopieren in einem Rutsch durch aufrufen der
dict
Konstruktor mit dem zusätzlichen Schlüsselwort-Argumente:InformationsquelleAutor der Antwort Frerich Raabe
dict2 = dict1
kopiert nicht das Wörterbuch. Es bietet einfach die Programmierer einen zweiten Weg (dict2
) beziehen sich auf das gleiche Wörterbuch.InformationsquelleAutor der Antwort
Jede variable in python (Sachen wie
dict1
oderstr
oder__builtins__
ist ein Zeiger auf einige versteckte platonische "Objekt" im inneren der Maschine.Wenn Sie
dict1 = dict2
Sie nur Punktdict1
auf das gleiche Objekt (oder Speicher, oder was auch immer Analogie, die dir gefällt) alsdict2
. Nun, das Objekt wird referenziert vondict1
ist das gleiche Objekt verwiesen wird, die vondict2
.Können Sie überprüfen:
dict1 is dict2
sollteTrue
. Auchid(dict1)
sollten die gleichen sein, wieid(dict2)
.Du willst
dict1 = copy(dict2)
oderdict1 = deepcopy(dict2)
.Den Unterschied zwischen
copy
unddeepcopy
?deepcopy
wird, stellen Sie sicher, dass die Elemente derdict2
(habe Sie es auf eine Liste?) sind auch Kopien.Ich nicht verwenden
deepcopy
viel - es ist in der Regel schlechte Praxis, um code zu schreiben, braucht es (meiner Meinung nach).InformationsquelleAutor der Antwort wisty
Dies verwirrt mich auch, zunächst, weil ich komme von einem C-hintergrund.
In C eine variable ist ein Speicherort im Speicher mit einem definierten Typ. Die Zuweisung an eine variable kopiert die Daten in die variable, die die Speicheradresse.
Aber in Python, Variablen wirken mehr wie Zeiger auf Objekte. Also die Zuordnung einer Variablen zu einer anderen nicht kopieren, es macht, dass die variable name auf das gleiche Objekt zeigen.
InformationsquelleAutor der Antwort Craig McQueen
dict1
ist ein symbol, das auf eine zugrunde liegende dictionary-Objekt. Die Zuordnungdict1
zudict2
lediglich weist die gleiche Referenz. Ein Schlüssel geändert wird, den Wert über diedict2
symbol ändert sich das zugrunde liegende Objekt, das betrifft auchdict1
. Das ist verwirrend.Ist es weitaus einfacher Grund über unveränderliche Werte als Referenzen, so stellen Sie Kopien, wenn möglich:
Dies ist syntaktisch das gleiche wie:
InformationsquelleAutor der Antwort Petrus Theron
Die besten und einfachsten Möglichkeiten, um erstellen Sie eine Kopie einer dict in beiden Python 2.7 und 3 sind...
1. Mit dict() Methode, anstelle der Erzeugung einer Referenz, die Punkte, um die bestehenden dict, erstellt es eine separate Tiefe Kopie derselben.
2. Mit dem built-in update() Methode der python-dictionary.
InformationsquelleAutor der Antwort Emrit
Da python arbeiten mit der Referenz, so dass, wenn Sie haben dict2 = dict1 übergeben Sie einen Verweis auf dict2, das war das gleiche wie dict1. Also, wenn Sie eine änderung in dict1 oder dict2 Sie ändern eine Referenz, und beide dicts chages. Sorry, wenn ich versehentlich etwas auf Englisch.
InformationsquelleAutor der Antwort Rodrigo Moraes
Als andere haben erklärt, die gebaut-in
dict
nicht tun, was Sie wollen. Aber in Python2 (und wahrscheinlich auch 3) Sie können ganz einfach erstellen Sie eineValueDict
Klasse, die Kopien mit=
so können Sie sicher sein, dass das original nicht verändert wird.Entnehmen Sie bitte den lvalue Modifikation Muster hier diskutiert: Python 2.7 - saubere syntax für lvalue änderung. Die wichtige Beobachtung ist, dass
str
undint
Verhalten sich wie Werte in Python (auch wenn Sie eigentlich unveränderliche Objekte unter der Haube). Während Sie beobachten, dass, beachten Sie bitte auch, dass nichts ist magisch Besondere anstr
oderint
.dict
kann verwendet werden, in viel die gleiche Weise, und ich kann mir denken, viele Fälle, in denenValueDict
Sinn macht.InformationsquelleAutor der Antwort personal_cloud
weil dict2 = dict1, dict2 hält den Verweis auf dict1. Beide dict1 und dict2 Punkte auf der gleichen Position im Speicher. Dies ist nur ein ganz normaler Fall während der Arbeit mit veränderlichen Objekten in python. Bei der Arbeit mit veränderlichen Objekte in python, müssen Sie vorsichtig sein, da ist es schwer zu Debuggen. Wie im folgenden Beispiel.
Diesem Beispiel Absicht ist, um alle Benutzer-ids, einschließlich gesperrter ids.
Haben wir von ids-variable, aber wir haben auch aktualisiert die Wert my_users unabsichtlich. wenn Sie erweiterte die ids mit blocked_ids my_users aktualisiert wurde, weil ids finden my_users.
InformationsquelleAutor der Antwort Vkreddy Komatireddy
Können Sie direkt verwenden:
denen Objekt-dict2 ist eine unabhängige Kopie von dict1, so können Sie ändern dict2 ohne dict1.
Dies funktioniert für jede Art von Objekt.
InformationsquelleAutor der Antwort Viiik