So kopieren Sie eine Liste in Python (Shallow vs. Deep Copy)

Erfahren Sie, wie Sie eine Liste in Python kopieren. Entdecken Sie Listen-Slicing, die copy()-Methode und Listenkonstruktoren und lernen Sie den Unterschied zwischen flachen und tiefen Kopien kennen.

Probieren Sie diese Lösung im Editor aus

Übersicht

In Python sind Listen veränderliche Objekte und Variablen enthalten im Speicher Verweise auf diese Objekte und nicht die tatsächlichen Werte. Das bedeutet, dass, wenn Sie einer neuen Variablen eine Liste zuweisen (z. B. „list_b = list_a“), beide Variablen auf genau dieselbe Liste verweisen. Jede über „list_b“ vorgenommene Änderung wirkt sich sofort auf „list_a“ aus. Um diesen Nebeneffekt zu vermeiden, müssen Sie eine explizite Kopie der Liste erstellen.

Python bietet mehrere Möglichkeiten, eine flache Kopie einer Liste zu erstellen. Eine flache Kopie erstellt eine neue Liste, die Verweise auf die in der ursprünglichen Liste gefundenen Elemente enthält. Zu den gängigen Methoden gehören die Verwendung der integrierten Listenmethode „.copy()“, die Verwendung von Listen-Slicing „list_a[:]“ oder die Übergabe der Liste an den „list()“-Konstruktor. All dies erstellt einen neuen Listencontainer, der es Ihnen ermöglicht, Elemente unabhängig voneinander anzuhängen oder zu entfernen.

Wenn eine Liste jedoch verschachtelte veränderbare Objekte (wie Listen oder Wörterbücher) enthält, dupliziert eine flache Kopie nur den äußeren Container; Die verschachtelten Objekte bleiben gemeinsam genutzt. Durch Ändern einer verschachtelten Liste in der Kopie wird die ursprüngliche Liste geändert. Um dies zu verhindern, müssen Sie eine tiefe Kopie mit der Funktion „deepcopy()“ des Moduls „copy“ durchführen, die jedes Objekt innerhalb der Hierarchie rekursiv klont.

Code- und Ausführungsausgabe

Dieser Code demonstriert die Referenzzuweisungsfalle, das flache Kopieren mit list.copy() und das tiefe Kopieren verschachtelter Listen mit dem Kopiermodul.

import copy

# 1. The assignment reference trap (Not a copy!)
original = [1, 2, 3]
reference = original
reference.append(99)
print("Reference modification affects original:", original)

# Reset list
original = [1, 2, 3]

# 2. Creating a shallow copy (using list.copy())
shallow_copy = original.copy()
shallow_copy.append(100)
print("\nOriginal:", original)
print("Shallow copy:", shallow_copy)

# 3. The nested list limitation of shallow copies
nested = [[1, 2], [3, 4]]
shallow_nested = nested.copy()
shallow_nested[0].append(99) # Modifying nested list
print("\nOriginal nested:", nested)
print("Shallow nested copy:", shallow_nested)

# 4. Creating a deep copy
nested_original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_original)
deep_copy[0].append(99)
print("\nOriginal nested:", nested_original)
print("Deep copy (completely independent):", deep_copy)
Terminal-Ausgabe
Reference modification affects original: [1, 2, 3, 99]

Original: [1, 2, 3]
Shallow copy: [1, 2, 3, 100]

Original nested: [[1, 2, 99], [3, 4]]
Shallow nested copy: [[1, 2, 99], [3, 4]]

Original nested: [[1, 2], [3, 4]]
Deep copy (completely independent): [[1, 2, 99], [3, 4]]

Schrittweise Umsetzung

  • Verwenden Sie my_list.copy() oder my_list[:], um eine flache Kopie flacher Listenstrukturen zu erstellen.
  • Vermeiden Sie Referenzzuweisungen wie copy_list = my_list, wenn Sie unabhängige Sammlungen benötigen.
  • Importieren Sie das Kopiermodul und verwenden Sie copy.deepcopy(my_list) für Listen, die verschachtelte veränderbare Strukturen enthalten.
  • Stellen Sie sicher, dass Sie Ihre Datenstrukturen verstehen, um Leistung und Speicherbedarf zu optimieren.

Häufig gestellte Fragen

Was ist der Unterschied zwischen einer flachen Kopie und einer tiefen Kopie?

Eine flache Kopie kopiert den äußersten Container, verweist jedoch auf verschachtelte veränderliche Objekte. Eine tiefe Kopie dupliziert rekursiv alle verschachtelten Container und Objekte, was zu vollständig isolierten Datenstrukturen führt.

Ist das Listen-Slicing (list[:]) schneller als list.copy()?

Ihre Leistung ist praktisch identisch, da beide unter der Haube optimierte C-Operationen ausführen. Aus Gründen der Lesbarkeit wird im Allgemeinen die Verwendung von list.copy() bevorzugt.

Verwandte Themen

Empfohlene Python-Ressourcen

Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.