Jaka jest różnica między copy a deepcopy w Python?

W dzisiejszych czasach, programowanie obiektowe stało się jednym z kluczowych elementów tworzenia oprogramowania. Python, jako jeden z najpopularniejszych języków programowania, oferuje programistom szeroki zakres możliwości, w tym manipulację obiektami i ich kopiowanie. Jednakże, przy kopiowaniu obiektów, często pojawia się pytanie: jaka jest różnica między copy a deepcopy? W tym artykule przyjrzymy się bliżej tej kwestii, zaczynając od definicji, poprzez przykłady kodu, aż po podsumowanie.

Podstawowe pojęcia

Zanim przejdziemy do przykładów, warto wyjaśnić podstawowe pojęcia. W Pythonie, kopia obiektu może być wykonana na dwa sposoby: przy użyciu funkcji copy() oraz deepcopy(). Różnica między nimi tkwi w sposobie, w jaki są kopiowane obiekty, szczególnie gdy mamy do czynienia z obiektami zagnieżdżonymi, czyli takimi, które zawierają inne obiekty.

Przykład kodu z copy i deepcopy

Aby lepiej zrozumieć różnicę między copy a deepcopy, rozważmy następujący przykład:

import copy

class Box:
    def __init__(self, items):
        self.items = items

# Tworzenie obiektu Box z listą przedmiotów
original_box = Box(["apple", "banana", "cherry"])

# Utworzenie płytkiej kopii (shallow copy) przy użyciu copy()
shallow_copy_box = copy.copy(original_box)

# Utworzenie głębokiej kopii (deep copy) przy użyciu deepcopy()
deep_copy_box = copy.deepcopy(original_box)

# Modyfikacja oryginalnej listy przedmiotów
original_box.items.append("date")

# Wyświetlenie zawartości każdego pudełka
print("Original box items:", original_box.items)
print("Shallow copy box items:", shallow_copy_box.items)
print("Deep copy box items:", deep_copy_box.items)
Analiza przykładu
  • Po dodaniu nowego elementu do listy w oryginalnym obiekcie (original_box), zmiana ta pojawi się również w shallow_copy_box. Dzieje się tak, ponieważ copy() tworzy tylko płytką kopię obiektu, co oznacza, że kopiowane są tylko referencje do obiektów zagnieżdżonych, a nie same obiekty.
  • W przeciwieństwie do tego, deep_copy_box zachowuje swoją pierwotną listę przedmiotów bez zmian, nawet po modyfikacji listy w original_box. deepcopy() tworzy kopię obiektu wraz ze wszystkimi obiektami zagnieżdżonymi, co oznacza, że każdy zagnieżdżony obiekt jest również kopiowany.

Podsumowanie

Różnica między copy a deepcopy w Pythonie jest kluczowa podczas pracy z obiektami zagnieżdżonymi. Użycie copy() jest odpowiednie, gdy nie mamy do czynienia z obiektami zagnieżdżonymi lub gdy chcemy, aby kopie obiektów dzieliły z oryginałem te same zagnieżdżone obiekty. Natomiast deepcopy() jest używane, gdy potrzebujemy pełnej niezależności kopiowanego obiektu od oryginału, włącznie z wszystkimi obiektami zagnieżdżonymi. Wybór metody zależy więc od konkretnego przypadku użycia i wymagań dotyczących zachowania kopii obiektów.

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

Scroll to Top