Czasami będziesz potrzebować pełnej kopii obiektu, innym razem będziesz chciał, aby korzystał z referencji. Zobacz różnice w działaniu.

Python oferuje kilka skutecznych podejść do zarządzania danymi. Zrozumienie koncepcji płytkiego i głębokiego kopiowania ma kluczowe znaczenie podczas pracy ze strukturami danych, takimi jak listy zagnieżdżone, słowniki lub obiekty niestandardowe.

Zarówno kopia płytka, jak i głęboka umożliwiają tworzenie replik struktur danych, ale działają inaczej w przypadku danych zagnieżdżonych.

Korzystanie z płytkiej kopii

Płytka kopia polega na utworzeniu kopii struktury najwyższego poziomu oryginalnego obiektu. Oznacza to, że jeśli oryginalny obiekt zawiera obiekty zagnieżdżone, kopia będzie odnosić się do tych samych zagnieżdżonych obiektów, co oryginał. Innymi słowy, utworzenie płytkiej kopii obiektu powoduje zduplikowanie jego najbardziej zewnętrznej struktury, a nie jakichkolwiek zagnieżdżonych obiektów, które może zawierać.

Aby wykonać płytką kopię w Pythonie, możesz użyć modułu kopiowania Kopiuj() funkcja lub .Kopiuj() metoda na obiekcie.

Rozważmy przykład praca z listą lub słownikiem w Pythonie.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

W powyższym kodzie lista_główna zmienna przechowuje listę zawierającą liczby całkowite i listę wewnętrzną (obiekt zagnieżdżony) zawierającą litery. Funkcja kopiowania tworzy kopię pliku lista_główna które kod przechowuje w innej zmiennej, płytka_kopia.

Wszelkie zmiany wprowadzone w pliku płytka_kopia zagnieżdżona lista będzie również miała bezpośredni wpływ na listę lista_główna i wzajemnie. Zmiany te pokazują, że zagnieżdżona lub wewnętrzna lista płytka_kopia jest jedynie odniesieniem do tego z lista_główna, dzięki czemu zmiany zostaną zastosowane w lista_główna zbyt.

Tymczasem wszelkie zmiany wprowadzone w elementach zewnętrznych (liczbach całkowitych) w którymkolwiek z nich płytka_kopia Lub lista_główna będzie miało wpływ tylko na tę instancję. Te zewnętrzne elementy stanowią niezależne wartości same w sobie, a nie tylko zwykłe odniesienia.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Dane wyjściowe pokazują, że zewnętrzne elementy obu list są od siebie niezależne:

Tę samą ideę można zastosować podczas pracy ze słownikami.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}}
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Zmiany wprowadzone w zagnieżdżonym słowniku dykt1 wpływać na oba dykt1 I dykt2. Jednocześnie zmiany w elementach zewnętrznych dykt1 wpływać tylko na to.

Korzystanie z głębokiej kopii

Zamiast odwoływać się do zagnieżdżonych obiektów oryginalnej kopii, głęboka kopia tworzy całkowicie odrębną kopię oryginalnego obiektu i jego zagnieżdżonych obiektów. Modyfikowanie głębokiej kopii nie wpłynie na oryginalny obiekt i odwrotnie; są to naprawdę odrębne wartości.

Aby wykonać głęboką kopię w Pythonie, użyj metody głęboka kopia() funkcja modułu kopiującego.

Rozważmy przykład pracy z listą.

import copy

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Tutaj kod wykonuje głęboką kopię lista_główna, tworząc niezależną kopię o nazwie głęboka_kopia.

Kiedy modyfikujesz zagnieżdżoną listę lub elementy zewnętrzne w pliku głęboka_kopia, zmiany nie mają wpływu na oryginalną listę i odwrotnie. To pokazuje, że zagnieżdżona lista lub elementy zewnętrzne nie są współdzielone pomiędzy dwiema kopiami.

Praca z obiektami niestandardowymi

Możesz utworzyć obiekt niestandardowy za pomocą zdefiniowanie klasy Pythona i utworzenie instancji klasy.

Oto przykład tworzenia prostego obiektu z pliku Książka klasa:

classBook:
def__init__(self, title, authors, price):
self.title = title
self.authors = authors
self.price = price

def__str__(self):
returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Teraz wykonaj zarówno płytką, jak i głęboką kopię przykładu tego Książka klasa za pomocą Kopiuj moduł.

import copy

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Jak widać, płytka kopia (książka2) jest nowym obiektem, ale odwołuje się do tego samego obiektu wewnętrznego (listy autorów), co obiekt oryginalny (książka 1). Zatem zmiana autorów obiektu pierwotnego dotyczy obu instancji (księga 1 i księga 2), natomiast zmiana pozycji zewnętrznej (księga 1 i księga 2)cena) wpływa tylko na oryginalny obiekt (książka 1).

Z drugiej strony wykonanie głębokiej kopii tworzy niezależną kopię oryginalnego obiektu, włączając kopie wszystkich znajdujących się w nim obiektów.

# Create a Book object
book1 = Book("Why MakeUseOf Deep Copy?", \
["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

W tym przypadku głęboka kopia (książka2) jest obiektem całkowicie niezależnym i modyfikującym obiekt oryginalny (książka 1) nie ma na to wpływu.

Wykorzystuje płytkie kopiowanie i głębokie kopiowanie

Aby móc wybrać odpowiednie podejście do manipulowania danymi, niezwykle ważne jest zrozumienie głębokiego i płytkiego kopiowania. Oto kilka scenariuszy, w których można zastosować każdą metodę:

  • Użyj płytkiej kopii, jeśli chcesz replikować złożony obiekt bez generowania nowych instancji jego zagnieżdżonych obiektów. Takie podejście jest bardziej wydajne pod względem pamięci i szybsze niż głębokie kopiowanie, ponieważ nie duplikuje zagnieżdżonych obiektów.
  • Użyj płytkiej kopii, aby utworzyć migawkę stanu obiektu, jednocześnie udostępniając pewne podstawowe dane pomiędzy obiektem oryginalnym i skopiowanym.
  • Użyj głębokiej kopii, jeśli chcesz zmodyfikować replikę obiektu bez wpływu na oryginał. Generuje to niezależne kopie zagnieżdżonych obiektów, zapewniając, że jakiekolwiek zmiany w kopii nie będą miały zastosowania do oryginału.
  • Głębokie kopiowanie ma kluczowe znaczenie, gdy potrzebne są niezależne kopie zagnieżdżonych struktur danych, głównie w przypadku rekurencyjnych lub skomplikowanych hierarchii obiektów.

Wydajność i rozważania

Ponieważ płytka kopia nie generuje nowych instancji zagnieżdżonych obiektów, zazwyczaj działa szybciej i zużywa mniej pamięci niż głęboka kopia. Jednakże oryginał i płytka kopia mogą powodować niepożądane skutki uboczne zmiany współdzielonych elementów wewnętrznych.

Szczególnie w przypadku dużych i głęboko zagnieżdżonych struktur danych, głębokie kopiowanie, procedura rekurencyjna, może być wolniejszy i zużywać więcej pamięci. Zapewnia jednak całkowitą niezależność między oryginałem a głębokim duplikatem, dzięki czemu skomplikowane manipulacje danymi są bezpieczniejsze.

Najlepsza opcja kopiowania Twoich danych

Wiele języków programowania wykorzystuje koncepcję płytkiej i głębokiej kopii. Zrozumienie tego pozwala manipulować danymi bez nieprzewidzianych konsekwencji.

Stosując techniki płytkiego i głębokiego kopiowania, możesz wybrać najlepsze podejście do bezpiecznego duplikowania struktur danych. Rozumiejąc wpływ na dane, uzyskasz bardziej niezawodne i przewidywalne wyniki swojego kodu.