Jaka jest różnica między płytką kopią a głęboką kopią?

W języku programowania Python, zarządzanie pamięcią przy kopiowaniu obiektów może być realizowane na dwa sposoby: poprzez płytką kopię (shallow copy) lub głęboką kopię (deep copy). Te dwa podejścia mają kluczowe różnice w sposobie, w jaki traktują obiekty i ich zagnieżdżone obiekty. Zrozumienie tej różnicy jest istotne dla efektywnej i oczekiwanej manipulacji danymi.

Przykład kodu z wyjaśnieniami

Rozważmy listę, która zawiera inne listy (zagnieżdżone obiekty), aby zilustrować różnice między płytką a głęboką kopią.

import copy  # Importujemy moduł copy

# Tworzymy listę z zagnieżdżonymi listami
original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# Robimy płytką kopię za pomocą metody copy()
shallow_copied_list = copy.copy(original_list)

# Robimy głęboką kopię za pomocą metody deepcopy()
deep_copied_list = copy.deepcopy(original_list)

# Modyfikujemy oryginalną listę
original_list[0][0] = 'X'

# Wyświetlamy listy po modyfikacji
print("Oryginalna lista:", original_list)
print("Płytko skopiowana lista:", shallow_copied_list)
print("Głęboko skopiowana lista:", deep_copied_list)

Komentarze do kodu:

  • Importujemy moduł copy, który udostępnia funkcje do kopiowania obiektów.
  • Tworzymy original_list z zagnieżdżonymi listami jako przykład złożonego obiektu.
  • Używamy copy.copy() do stworzenia płytkiej kopii, która kopiuje obiekt na najwyższym poziomie, ale odniesienia do zagnieżdżonych obiektów pozostają współdzielone.
  • Używamy copy.deepcopy() do stworzenia głębokiej kopii, która rekursywnie kopiuje wszystkie zagnieżdżone obiekty, tworząc w pełni niezależną kopię.
  • Modyfikujemy oryginalną listę, zmieniając pierwszy element pierwszej zagnieżdżonej listy.
  • Wyświetlamy wszystkie listy, aby zobaczyć efekt modyfikacji.

Podsumowanie

Po modyfikacji oryginalnej listy, zmiana jest widoczna w płytko skopiowanej liście, ponieważ zagnieżdżone listy są współdzielone między oryginałem a kopią. W głęboko skopiowanej liście zmiany nie są widoczne, ponieważ wszystkie zagnieżdżone obiekty zostały skopiowane rekursywnie, co oznacza, że jest to całkowicie niezależna kopia oryginału. Różnica ta jest kluczowa, gdy pracujemy z złożonymi strukturami danych i zależy nam na niezależności kopiowanych danych.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs Python od podstaw w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top