So kopieren Sie ein Wörterbuch aus, und nur die Kopie Bearbeiten
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 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
Beachten Sie auch, dass die dict.Kopie() ist flach, wenn es eine verschachtelte Liste/etc dort werden die änderungen auf beide angewendet. Wenn ich mich Recht erinnere. Deepcopy vermeiden.
Es ist nicht ganz korrekt, dass python niemals implizit kopiert Objekte. Primitive Datentypen wie int, float und bool sind auch als Objekte behandelt (nur ein
dir(1)
zu sehen, dass), aber Sie sind implizit kopiert.Ich denke, Sie haben vielleicht Missverständnisse über den Python auf der Grundlage, wie andere Sprachen, die Sie behandelt haben, die mit der Arbeit. In Python, a) Es gibt kein Konzept von "primitiven Datentypen".
int
,float
, undbool
Instanzen sind echte Python-Objekte, und b) - Objekte dieser Typen nicht implizit kopiert, wenn Sie Sie weitergeben, und nicht auf eine semantische Python-Ebene sicher und auch nicht als ein detail in CPython.Unbegründete Rhetorik wie "Tiefe Kopie ist schädlich" ist wenig hilfreich. Alle sonst seiend gleich, flach kopieren einer komplexen Datenstruktur ist
copy.deepcopy()
eher alsdict()
oderdict.copy()
. Imran'N schlüssige Antwort ist auf der rechten Seite der Vernunft, im Gegensatz zu dieser Antwort.InformationsquelleAutor 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.Hier gilt das gleiche. deepcopy() funktioniert der trick. War vermasselt meine verschachtelten dicts innerhalb einer rotierenden cache durch das hinzufügen eines Zeitstempels zu einer 'Kopie' des ursprünglichen Ereignisses. Danke!!!
Diese tatsächlich markiert werden soll, als die richtige Antwort; Diese Antwort ist allgemein und es funktioniert für ein Wörterbuch der Wörterbücher auch.
Ich Stimme mit Ihnen überein. Dies ist die einzige Antwort, die befriedigt mein Bedürfnis.
Dies sollte die akzeptierte Antwort. Die unbestätigte "Tiefe Kopie ist schädlich" - Rhetorik eingebettet in den Kommentar-Abschnitt der aktuellen akzeptierte Antwort eklatant lädt die Synchronisierung sorgen beim kopieren von geschachtelten dictionaries (wie hier beschrieben) und sollte in Frage gestellt werden als solche.
InformationsquelleAutor Imran
Nur um zu klären:
w=copy.deepcopy(x)
ist der Schlüssel Linie.Was ist der Unterschied zwischen
dict2 = dict1
unddict2 = copy.deepcopy(dict1)
?y=x macht die beiden Namen(Referenzen) verweisen auf ein und dasselbe Objekt, D. H. "y ist x" Wahr ist. Alle änderungen, die auf das Objekt über x ist äquivalent zu einer gleichen änderung durch y. Aber u, v, w sind Referenzen auf verschiedene Objekte, die Werte kopiert von x während der Instanziierung obwohl. Wie für die Unterschiede zwischen u,v(shallow copy) und w(deepcopy), überprüfen Sie bitte docs.python.org/2/library/copy.html
InformationsquelleAutor gpanda
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.
Es hat eine Art von c ' ish Aussehen... aber bei der Zusammenlegung mehrere Wörterbücher, die syntax sieht ziemlich glatt.
Seien Sie vorsichtig mit, dass, es führt nur eine flache Kopie.
du hast Recht @SebastianDressler, ich werde makde Anpassungen. thnx.
Nützlich, wenn Sie möchten, erstellen Kopie mit einigen spicies:
dict2 = {**dict1, 'key3':'value3'}
InformationsquelleAutor PabTorre
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.
Beachten Sie, dass diese Methode nicht führen Sie eine Tiefe Kopie, und wenn Sie möchten, eine flache Kopie, keine Kontrolle über Ihre Schlüssel kopiert werden,
d2 = dict.copy(d1)
erfordert keine Importe.oder Sie können eine Methode aufrufen wie eine Methode:
d2 = d1.copy()
InformationsquelleAutor Dashing Adam Hughes
Die besten und einfachsten Möglichkeiten, um erstellen Sie eine Kopie einer dict in beiden Python 2.7 und 3 sind...
, Um eine Kopie erstellen, von einfachen(single-level) Wörterbuch:
1. Mit dict() Methode, anstelle der Erzeugung einer Referenz, die Punkte, um die bestehenden dict.
2. Mit dem built-in update() Methode der python-dictionary.
Erstellen Sie eine Kopie der verschachtelte oder komplexe Wörterbuch:
Verwenden Sie die integrierte kopieren - Moduls, welches eine generische flache und Tiefe Kopie-Operationen. Dieses Modul ist in Python 2.7 und 3.*
dict()
erstellt eine flache Kopie nicht eine Tiefe Kopie. Was bedeutet, dass, wenn Sie eine geschachteltedict
dann die äußerendict
wird eine Kopie, sondern die innere dict wird eine Referenz auf die ursprüngliche innere dict.ja, diese beiden Methoden erzeugen eine flache Kopie, nicht die Tiefe. Siehe die aktualisierte Antwort.
InformationsquelleAutor Emrit
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 loosen
Zusätzlich zu den anderen Lösungen, die Sie verwenden können
**
integrieren Sie das Wörterbuch, in ein leeres dictionary, z.B.,shallow_copy_of_other_dict = {**other_dict}
.Nun haben Sie eine "flache" Kopie
other_dict
.Angewendet auf dein Beispiel:
Zeiger: Unterschied zwischen flachen und tiefen Exemplaren
Danke für die Beratung, überarbeitete ich meine Antwort.
Ich versuchte dies aber mit Schwierigkeiten. Dies funktioniert nur für python-3.5. python.org/dev/peps/pep-0448
InformationsquelleAutor d4rty
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 Frerich Raabe
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.
Weil alles in Python ist ein Objekt! diveintopython.net/getting_to_know_python/... (ja, diese Antwort ist viele Jahre zu spät, aber vielleicht ist es von einigem nutzen, um jemandem!)
Ich glaube, dass die Python-Sprache-Semantik sagen, es gibt keine "Variablen". Sie sind sogenannte "named references"; d.h. die Referenz auf ein Objekt ist eine syntaktische Zeichenfolge im code. Ein Objekt kann beliebig viele benannte Referenzen. Immutable Objekte wie int und float und str-Instanzen nur eine Instanz pro Prozess. Eine int-1 im Speicher nicht ändern, um ein 2 oder ein anderer Wert an der gleichen Speicheradresse, wenn Sie dies tun myvalue=1 meinwert=2
InformationsquelleAutor Craig McQueen
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 wisty
dict2 = dict1
kopiert nicht das Wörterbuch. Es bietet einfach die Programmierer einen zweiten Weg (dict2
) beziehen sich auf das gleiche Wörterbuch.InformationsquelleAutor
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 Petrus Theron
Gibt es viele Möglichkeiten, zu kopieren Dict-Objekt, das ich einfach nutzen
dict_2 = dict_1.copy()
ist viel effizienter und logischer.Beachten Sie, dass wenn Sie eine dict-innen dict1, mit dict_1.copy() die änderungen, die Sie tun, auf die innere dict in dict_2 werden auch angewendet, um die innere dict in dict_1. In diesem Fall sollten Sie "kopieren".deepcopy(dict_1) statt.
Es funktioniert nur für single-level-Wörterbuch.
InformationsquelleAutor imcaozi
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 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 personal_cloud
Schönen Erklärungen, möchte ich noch hinzufügen die einfachste Regel, die Sie sich beziehen können, wenn das denken in der Python-Variable, die Sie zuweisen gleich mit
=
. Wenn der Datentyp ist unveränderlich, Sie müssen nicht sorgen zu machen über das unerwartete Verhalten auftreten. Wenn der Datentyp ist veränderlich, werden Sie wollen, stellen Sie sicher, eine Kopie zu verhindern, dass das unerwartete Verhalten Ihr begegnet.Unveränderliche Datentypen: Zeichenfolge (ein Tupel von Zeichen), Tupel
Mutable Datentypen: list, array, dictionary
InformationsquelleAutor Nikolay Shindarov
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 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.
__repr__
rekonstruiert werden, die von eval, noch kann die Klasse des Objekts in der aktuellen scope aufgerufen werden. Auch kleben mit built-in-Typen, dies wird fehlschlagen, wenn das gleiche Objekt ist gespeichert unter mehrere Schlüssel, alsdict2
hätte dann zwei separate Objekte. Eine selbst-Referentielle Wörterbuch, wodict1
enthält sich, wird stattdessen enthaltenEllipsis
. Es wäre besser, verwendendict1.copy()
Objekte (oder "Werte") sind nicht zu erwarten, dass immer eine treue Darstellung von Zeichen in Zeichenfolgen nicht in einen üblichen lesbarer Weise auf jeden Fall.
InformationsquelleAutor Viiik