Wie man ein Dictionary in Python kopiert

  1. Kopieren eines Dictionaries in Python: Übergeben durch Referenz
  2. Kopieren Sie ein Dictionary in Python: Übergabe nach Wert
  3. Seichte Kopie des Python-Dictionaries

In diesem Tutorial wird besprochen, wie Sie ein Dictionary in Python kopieren können.

Wir werden zeigen, wie man ein Dictionary auf zwei Arten kopieren kann: Übergabe nach Wert und Übergabe nach Referenz.

Kopieren eines Dictionaries in Python: Übergeben durch Referenz

In Python werden Objekte nicht implizit kopiert. Wenn wir versuchen, food in eine neue Variable meal zu kopieren, werden die Werte von food in meal kopiert, aber ebenso die Referenz von food.

meal = food

Durch die direkte Gleichsetzung eines Objekts mit einem anderen wird das neue Objekt auf das vorherige verweisen; das bedeutet, dass die beiden Variablen auf dasselbe eindeutige Objekt verweisen.

Wenn wir den Wert Fruit in meal in Banana ändern, wird auch der Wert von Fruit in food ersetzt.

meal['Fruit'] = 'Banana'
print(food)
print(meal)

Ausgabe:

{'Fruit': 'Banana', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'}
{'Fruit': 'Banana', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'}

Dasselbe gilt, wenn wir versuchen, einen Schlüssel im meal-Block zu aktualisieren. Wir ersetzen den Schlüssel Fruit durch Circle Fruit und kopieren seinen Wert, bevor wir ihn aus dem Dictionary herausnehmen.

meal['Circle Fruit'] = meal.pop('Fruit')
print(food)
print(meal)

Ausgabe:

{'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Circle Fruit': 'Orange'}
{'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Circle Fruit': 'Orange'}

Der Wert von food wird immer noch ersetzt, auch wenn wir ihn nicht direkt modifiziert haben; das liegt daran, dass die Methode, die wir benutzt haben, um food nach meal zu kopieren, die Weitergabe per Referenz ist.

Python-KopierDictionary - Durch Verweis übergeben

Kopieren Sie ein Dictionary in Python: Übergabe nach Wert

Die Wertübergabe bedeutet, dass eine tatsächliche Kopie des Objekts im Speicher erstellt wird, anstatt die Kopie beim Kopieren eines Objekts auf das Originalobjekt zu zeigen.

Wenn wir ein Dictionary kopieren und nicht auf die Originalwerte verweisen wollen, dann sollten wir einen Weg finden, ein neues Objekt im Speicher zu instanziieren. In Python gibt es ein paar Funktionen, die diesen Ansatz unterstützen: dict(), copy() und deepcopy().

Die Funktion dict() instanziiert ein neues Dictionary-Objekt. Wenn Sie ein vorhandenes Dictionary um diese Funktion wickeln, wird eine neue Instanz des Objekts erzeugt.

Für diese Methode werden wir dasselbe Beispiel aus dem Dictionary food verwenden.

meal = dict(food)

Eine andere Möglichkeit der Wertübergabe ist die Verwendung des Befehls copy(), der dasselbe tut wie dict(): ein neues Objekt im Speicher instanziieren. Der Unterschied besteht darin, dass copy() eine eingebaute Funktion von Sammelobjekten, einschließlich Wörterbüchern, ist.

meal = food.copy()

Für beide Szenarien modifizieren wir den Wert Fruit und ersetzen den Schlüssel Vegetable:

meal['Fruit'] = 'Apple'
meal['Greens'] = meal.pop('Vegetable')
print(food)
print(meal)

Ausgabe:

{'Fruit': 'Orange', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'} # food (original)
{'Fruit': 'Apple', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Greens': 'Lettuce'} # meal (copy)

Indem wir ein neues Objekt meal mit dict() oder copy() instanziieren, vermeiden wir es, auf das ursprüngliche Objekt zu verweisen und seine Werte zu aktualisieren, wenn Mahlzeit aktualisiert wird.

Seichte Kopie des Python-Dictionaries

Das Problem mit dict() und copy() ist, dass sie nur eine flache Kopie auf das verwendete Objekt anwenden; dies ist ein Problem, wenn Ihr Dictionary eine komplexe verschachtelte Struktur hat.

Beim flachen Kopieren wird nur die erste Schicht im Speicher, die es sieht, kopiert, weil verschachtelte Objekte neue Plätze einnehmen.

Python-KopierDictionary - Flaches Kopieren

Lassen Sie uns das ursprüngliche Objekt in ein verschachteltes Dictionary ändern.

info = { "Numbers": [1, 2, 3],
         "Resident Name": "Sherlock",
         "Address": {"Street": "Baker",
                    "Number": "221B",
                    "City": "Miami"
                    }
       }

Deklarieren wir ein neues Objekt info2 unter Verwendung von copy() und dict() zum Kopieren aus info und ändern einige Werte im verschachtelten Dictionary.

info2 = info.copy() # or dict(info)
info2['Numbers'][1] = 4
info2["Resident Name"] = "Holmes"
info2["Address"]["City"] = "Lexington"
print(info)
print(info2)

Ausgabe:

{'Numbers': [1, 4, 3], 'Resident Name': 'Sherlock', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}
{'Numbers': [1, 4, 3], 'Resident Name': 'Holmes', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}

Die neuen Werte von Numbers und Address.City werden sowohl im Original als auch in der Kopie aktualisiert. Der Wert Resident-Name aktualisierte nur den info2-Block, da wir nur eine flache Kopie des Objekts durchgeführt haben.

Deep Copy Mit dem copy Modul in Python

Deep Copy behebt im Wesentlichen das Problem des flachen Kopierens. Beim Kopieren eines Objekts prüft es auf verschachtelte Objekte und erzeugt rekursiv neue Objekte im Speicher.

In Python können wir tiefes Kopieren mit dem Modul copy erreichen, das flache und tiefe Kopieroperationen und Hilfsprogramme enthält.

import copy

Wir werden die Funktion deepcopy() des Moduls verwenden, um die verschachtelten Objekte innerhalb unseres Dictionaries tief zu kopieren. Wir werden den gleichen Beispiel info-Block oben verwenden.

info2 = copy.deepcopy(info)
info2['Numbers'][1] = 4
info2["Resident Name"] = "Holmes"
info2["Address"]["City"] = "Lexington"
print(info)
print(info2)

Ausgabe:

{'Numbers': [1, 2, 3], 'Resident Name': 'Sherlock', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Miami'}}
{'Numbers': [1, 4, 3], 'Resident Name': 'Holmes', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}

Nun bleibt das ursprüngliche Dictionary info unverändert, auch mit den mehrfachen Änderungen in info2, einschließlich der verschachtelten Objekte.

Zusammenfassend kann man sagen, dass es viele Möglichkeiten gibt, ein Dictionary in Python zu kopieren, aber die Ausgabe wird nicht für alle gleich sein. Wenn Sie ein Dictionary direkt mit = zuweisen, wird es per Referenz übergeben, wobei auf das Originalobjekt verwiesen wird.

Seichte Kopierfunktionen wie dict() und copy() lösen dieses Problem nur für nicht verschachtelte Wörterbücher. Der beste Weg, ein Dictionary unter Berücksichtigung verschachtelter Wörterbücher zu kopieren, ist die Verwendung der Funktion deepcopy(), die vom Modul copy zur Verfügung gestellt wird.

Verwandter Artikel - Python Dictionary

  • Wie überprüft man in Python, ob ein Wert in einem Dictionary steht
  • So erhalten Sie alle Dateien eines Verzeichnisses