Nächstes Kapitel: Funktionen
Flaches und Tiefes Kopieren
Einleitung
Wie wir gesehen haben, die im Kapitel „Datentypen und Variablen“, Python hat ein seltsames Verhalten – im Vergleich mit anderen Programmiersprachen – wenn das zuweisen und kopieren einfacher Datentypen wie Integer und strings. Der Unterschied zwischen flachem und tiefem Kopieren ist nur für zusammengesetzte Objekte relevant, bei denen es sich um Objekte handelt, die andere Objekte enthalten, z. B. Listen oder Klasseninstanzen.,
Im folgenden Codeausschnitt zeigt y auf denselben Speicherort als X. Dies ändert sich, wenn wir y einen anderen Wert zuweisen. In diesem Fall erhält y einen separaten Speicherort, wie wir im Kapitel „Datentypen und Variablen“gesehen haben.
>>> x = 3>>> y = x
Aber selbst wenn dieses interne Verhalten im Vergleich zu Programmiersprachen wie C, C++ und Perl seltsam erscheint, erfüllen die beobachtbaren Ergebnisse der Zuweisungen unsere Erwartungen. Aber es kann problematisch sein, wenn wir veränderbare Objekte wie Listen und Wörterbücher kopieren.
Python erstellt echte Kopien nur, wenn es muss, dh, wenn der Benutzer, der Programmierer, dies ausdrücklich verlangt.
Wir stellen Ihnen die wichtigsten Probleme vor, die beim Kopieren veränderlicher Objekte auftreten können, d. H. Beim Kopieren von Listen und Wörterbüchern.
Kopieren einer Liste
>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1
Im obigen Beispiel ist colours1 eine einfache Liste zugeordnet. Im nächsten Schritt ordnen wir colour1 zu colours2. Danach wird colours2 eine neue Liste zugewiesen.
Wie erwartet blieben die Werte von colours1 unverändert., Wie in unserem Beispiel im Kapitel „Datentypen und Variablen“ war für colours2 ein neuer Speicherort zugewiesen worden, da wir dieser Variablen eine komplett neue Liste zugewiesen haben.
>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1
Aber die Frage ist, was passiert, wenn wir ein Element der Liste von Farben ändern2 oder Farben1?
Im obigen Beispiel weisen wir dem zweiten Element von colours2 einen neuen Wert zu. Viele Anfänger werden erstaunt sein, dass auch die Liste der Farben1 „automatisch“ geändert wurde.,
Die Erklärung ist, dass es keine neue Zuordnung zu colours2, nur auf eines seiner Elemente.
Kopieren Sie mit dem Slice-Operator
Es ist möglich, um vollständig zu kopieren flache Liste von Strukturen mit der slice-operator, ohne irgendwelche der Nebenwirkungen, die wir beschrieben haben:
>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>>
sobald Aber diese Liste enthält unterlisten, wir haben die gleichen Schwierigkeiten, also nur Zeiger auf thesublists.,
>>> lst1 = ]>>> lst2 = lst1
Dieses Verhalten wird im folgenden Diagramm dargestellt:
Wenn Sie dem 0.Element einer der beiden Listen einen neuen Wert zuweisen, tritt keine Nebenwirkung auf. Probleme treten auf, wenn Sie eines der Elemente der Unterliste ändern.
>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]
Das folgende Diagramm zeigt, was passiert, wenn eines der Elemente einer Unterliste geändert wird: Sowohl der Inhalt von lst1 als auch lst2 werden geändert.,
Mit der Methode deepcopy aus dem Modul copy
Eine Lösung für die beschriebenen Probleme ist die Nutzung des Moduls „kopieren“. Dieses Modul bietet die Methode „copy“, die eine vollständige Kopie voneine beliebige Liste, d. H. Flache und andere Listen.
Das folgende Skript verwendet unser Beispiel oben und diese Methode:
from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1
Wenn wir dieses Skript unter dem Namen speichern deep_copy.py und wenn wir das Skript mit „python deep_copy.,py „erhalten wir folgende Ausgabe:
$ python deep_copy.py ]]
Nächstes Kapitel: Funktionen