Podczas czytania dokumentacji dict.copy()napisano, że tworzy ona płytką kopię słownika. To samo dotyczy książki, którą obserwuję (Beazley's Python Reference), która mówi:
Metoda m.copy () tworzy płytką kopię elementów zawartych w obiekcie odwzorowującym i umieszcza je w nowym obiekcie odwzorowującym.
Rozważ to:
>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Więc założyłem, że to zaktualizuje wartość original(i doda „c”: 3) również, ponieważ robiłem płytką kopię. Na przykład, jeśli robisz to dla listy:
>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Działa to zgodnie z oczekiwaniami.
Skoro oba są płytkimi kopiami, dlaczego dict.copy()nie działa tak, jak się spodziewam? Czy moje rozumienie kopiowania płytkiego vs. głębokiego jest błędne?
![Ilustracja „a = b”: „a” i „b” oba wskazują na „{1: L}”, „L” wskazuje na „[1, 2, 3]”.](https://i.stack.imgur.com/4AQC6.png)
![Ilustracja „b = a.copy ()”: „a” wskazuje na „{1: L}”, „b” wskazuje na „{1: M}”, „L” i „M” oba wskazują na „[ 1, 2, 3] ”.](https://i.stack.imgur.com/Vtk4m.png)
![Ilustracja „b = copy.deepcopy (a)”: „a” wskazuje na „{1: L}”, „L” wskazuje na „[1, 2, 3]”; „b” wskazuje na „{1: M}”, „M” wskazuje na inną instancję „[1, 2, 3]”.](https://i.stack.imgur.com/BO4qO.png)