Manchmal möchten Sie eine vollständige Kopie eines Objekts, manchmal möchten Sie, dass es Referenzen verwendet. Sehen Sie die Unterschiede in der Aktion.

Python bietet mehrere effiziente Ansätze zur Datenverwaltung. Bei der Arbeit mit Datenstrukturen wie verschachtelten Listen, Wörterbüchern oder benutzerdefinierten Objekten ist es wichtig, die Konzepte der flachen und tiefen Kopie zu verstehen.

Mit der flachen und der tiefen Kopie können Sie Replikate von Datenstrukturen erstellen, sie verhalten sich jedoch bei verschachtelten Daten unterschiedlich.

Verwenden von Shallow Copy

Bei der flachen Kopie wird eine Kopie der obersten Struktur des Originalobjekts erstellt. Das bedeutet, dass, wenn das Originalobjekt verschachtelte Objekte enthält, die Kopie auf dieselben verschachtelten Objekte verweist wie das Original. Mit anderen Worten: Wenn Sie eine flache Kopie eines Objekts erstellen, wird dessen äußerste Struktur dupliziert, nicht etwaige darin enthaltene verschachtelte Objekte.

Um eine flache Kopie in Python durchzuführen, können Sie die Kopiermodule verwenden

instagram viewer
Kopieren() Funktion oder die .Kopieren() Methode für das Objekt.

Betrachten Sie ein Beispiel für Arbeiten mit einer Liste oder einem Wörterbuch in Python.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Im obigen Code ist die main_list Die Variable enthält eine Liste mit Ganzzahlen und eine innere Liste (verschachteltes Objekt) mit Buchstaben. Die Kopierfunktion erstellt eine Kopie davon main_list die der Code in einer anderen Variablen speichert, flache_kopie.

Alle Änderungen, die Sie an der vornehmen flache_kopie Die verschachtelte Liste wirkt sich auch direkt auf die der aus main_list und umgekehrt. Diese Änderungen zeigen, dass die verschachtelte oder innere Liste der flache_kopie ist nur eine Anspielung auf die des main_list, sodass die Änderungen in übernommen werden main_list zu.

In der Zwischenzeit werden alle Änderungen vorgenommen, die an den äußeren Elementen (den Ganzzahlen) in beiden vorgenommen wurden flache_kopie oder main_list wirkt sich nur auf diese Instanz aus. Diese äußeren Elemente sind eigenständige Werte und nicht nur bloße Referenzen.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Die Ausgabe zeigt, dass die äußeren Elemente beider Listen unabhängig voneinander sind:

Die gleiche Idee gilt für die Arbeit mit Wörterbüchern.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}}
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Am verschachtelten Wörterbuch von vorgenommene Änderungen dict1 beeinflussen beides dict1 Und dict2. Gleichzeitig werden Änderungen an den äußeren Elementen vorgenommen dict1 beeinflussen nur es.

Verwenden von Deep Copy

Anstatt auf die verschachtelten Objekte der Originalkopie zu verweisen, erstellt eine tiefe Kopie eine völlig separate Kopie des Originalobjekts und seiner verschachtelten Objekte. Das Ändern der tiefen Kopie hat keine Auswirkungen auf das Originalobjekt und umgekehrt; es sind wirklich getrennte Werte.

Um eine tiefe Kopie in Python zu erstellen, verwenden Sie die deepcopy() Funktion des Kopiermoduls.

Betrachten Sie ein Beispiel für die Arbeit mit einer Liste.

import copy

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Hier führt der Code eine tiefe Kopie von durch main_list, wodurch eine unabhängige Kopie mit dem Namen erstellt wird tiefe_kopie.

Wenn Sie die verschachtelte Liste oder die äußeren Elemente in ändern tiefe_kopie, Ihre Änderungen wirken sich nicht auf die ursprüngliche Liste aus und umgekehrt. Dies zeigt, dass die verschachtelte Liste oder die äußeren Elemente nicht von den beiden Kopien gemeinsam genutzt werden.

Arbeiten mit benutzerdefinierten Objekten

Sie können ein benutzerdefiniertes Objekt erstellen, indem Sie Definieren einer Python-Klasse und Erstellen einer Instanz der Klasse.

Hier ist ein Beispiel für die Erstellung eines einfachen Objekts aus a Buch Klasse:

classBook:
def__init__(self, title, authors, price):
self.title = title
self.authors = authors
self.price = price

def__str__(self):
returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Erstellen Sie nun sowohl eine flache Kopie als auch eine tiefe Kopie einer Instanz davon Buch Klasse mit der Kopieren Modul.

import copy

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Wie Sie sehen können, ist die flache Kopie (Buch2) ist ein neues Objekt, verweist jedoch auf dasselbe innere Objekt (Autorenliste) wie das ursprüngliche Objekt (Buch 1). Daher wirkt sich eine Änderung an den Autoren des ursprünglichen Objekts auf beide Instanzen (Buch1 und Buch2) aus, während eine Änderung am äußeren Element (Preis) betrifft nur das Originalobjekt (Buch 1).

Andererseits wird durch das Erstellen einer tiefen Kopie eine unabhängige Kopie des Originalobjekts erstellt, einschließlich Kopien aller darin enthaltenen Objekte.

# Create a Book object
book1 = Book("Why MakeUseOf Deep Copy?", \
["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

In diesem Fall ist die tiefe Kopie (Buch2) ist ein völlig unabhängiges Objekt und ändert das ursprüngliche Objekt (Buch 1) hat keinen Einfluss darauf.

Wird für Shallow Copy und Deep Copy verwendet

Es ist wichtig, tiefe und flache Kopien zu verstehen, damit Sie den geeigneten Ansatz für die Datenbearbeitung auswählen können. Hier sind einige Szenarien, in denen jede Methode anwendbar ist:

  • Verwenden Sie eine flache Kopie, wenn Sie ein komplexes Objekt replizieren möchten, ohne neue Instanzen seiner verschachtelten Objekte zu generieren. Dieser Ansatz ist speichereffizienter und schneller als Deep Copy, da keine verschachtelten Objekte dupliziert werden.
  • Verwenden Sie eine flache Kopie, um eine Momentaufnahme des Zustands eines Objekts zu erstellen und gleichzeitig einige zugrunde liegende Daten zwischen dem Original und den kopierten Objekten auszutauschen.
  • Verwenden Sie eine tiefe Kopie, wenn Sie eine Replik eines Objekts ändern möchten, ohne das Original zu beeinträchtigen. Dadurch werden unabhängige Kopien verschachtelter Objekte erstellt, wodurch sichergestellt wird, dass Änderungen an der Kopie nicht auf das Original angewendet werden.
  • Deep Copy ist von entscheidender Bedeutung, wenn Sie unabhängige Kopien verschachtelter Datenstrukturen benötigen, vor allem beim Umgang mit rekursiven oder komplexen Objekthierarchien.

Leistung und Überlegungen

Da beim flachen Kopieren keine neuen Instanzen verschachtelter Objekte generiert werden, wird es normalerweise schneller ausgeführt und benötigt weniger Speicher als beim tiefen Kopieren. Das Original und die flache Kopie können jedoch unerwünschte Nebenwirkungen durch die Änderung gemeinsamer interner Elemente haben.

Besonders für große und tief verschachtelte Datenstrukturen, Deep Copy, ein rekursives Verfahren, kann langsamer sein und mehr Speicher verbrauchen. Es stellt jedoch die völlige Unabhängigkeit zwischen dem Original und dem tiefen Duplikat sicher, wodurch komplexe Datenmanipulationen sicherer werden.

Die beste Kopieroption für Ihre Daten

Viele Programmiersprachen verwenden das Konzept der flachen und tiefen Kopie. Wenn Sie es verstehen, können Sie Daten ohne unvorhergesehene Folgen manipulieren.

Durch den Einsatz flacher und tiefer Kopiertechniken können Sie den besten Ansatz zum sicheren Duplizieren Ihrer Datenstrukturen auswählen. Wenn Sie die Auswirkungen auf Ihre Daten verstehen, erhalten Sie zuverlässigere und vorhersehbarere Ergebnisse mit Ihrem Code.