wprowadzenie
w tym samouczku omówimy shallow copies vs deep copies za pomocą przykładów w Pythonie. Omówimy definicję głębokiej i płytkiej kopii wraz z jej implementacją w języku Python w celu oceny podstawowych różnic między tymi dwoma typami kopii.
w wielu programach, które piszemy, bez względu na to, jak podstawowe są, musimy skopiować listę lub obiekt z jednego z wielu powodów, takich jak wydajność obliczeniowa., Istnieją dwa sposoby, aby to zrobić, albo zrobić głęboką kopię lub płytką kopię. Zanim omówimy różnice między nimi, najpierw zrozummy, czym dokładnie są głębokie i płytkie kopie.
Głębokie kopie w Pythonie
głęboka Kopia tworzy nową i oddzielną kopię całego obiektu lub listy z własnym unikalnym adresem pamięci. Oznacza to, że wszelkie zmiany wprowadzone w nowej kopii obiektu/listy nie będą odzwierciedlać oryginalnej. Proces ten odbywa się najpierw poprzez utworzenie nowej listy lub obiektu, a następnie rekurencyjne kopiowanie elementów z oryginalnego do nowego.,
mówiąc krótko, oba obiekty są całkowicie niezależne od siebie. Jest to podobne do pojęcia przekazywania przez wartość w językach takich jak C++, Java i C#.
przykład głębokiej kopii
aby zaimplementować koncepcję głębokiej kopii w Pythonie, będziemy używać modułu kopiowania.
Załóżmy, że mamy listę list o nazwieresult_A
, która zawiera oceny ucznia a z 3 przedmiotów przez pierwsze dwa lata szkoły, i chcemy stworzyć dokładnie podobną listę wyników dla ucznia B, jak również., Spróbujemy wykonać głęboką kopię listy result_A
I wprowadzić kilka zmian w tej głębokiej kopii później, aby pokazać oceny ucznia B.
przykład 1:
w powyższym skrypcie używamy metody deepcopy
z copy
moduł do kopiowania listy result_A
do result_B
. Następnie drukujemy zawartość obu list na ekranie.
wyjście:
, ], ]
jak widać, listy są identyczne. W dalszej części tego artykułu zobaczymy, czym różni się to od płytkich kopii.,
płytkie kopie w Pythonie
płytka Kopia tworzy również oddzielny nowy obiekt obiekt lub listę, ale zamiast kopiować elementy potomne do nowego obiektu, po prostu kopiuje odwołania do ich adresów pamięci. W związku z tym, jeśli dokonasz zmiany w oryginalnym obiekcie, będzie ona odzwierciedlać w skopiowanym obiekcie i odwrotnie. Krótko mówiąc, obie kopie są zależne od siebie. Jest to podobne do pojęcia przechodzenia przez odniesienie w językach programowania takich jak C++, C# i Java.,
Shallow Copy Example
aby zaimplementować to w Pythonie, użyjemy modułu copy
ponownie, ale tym razem wywołamy jego funkcję copy
.
użyjmy tej samej listy przykładów również dla przykładu shallow copy.
przykład 2:
# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)
w powyższym skrypcie używamy metody copy
z modułu copy
do wykonania płytkiej kopii listy result_A
, która nazwaliśmy result_B
., Następnie zawartość obu list została wydrukowana na konsoli.
wyjście:
, ], ]
ponownie, listy są takie same, jak oczekiwano. Następnie wyjaśnimy różnicę między wynikami otrzymywanymi z funkcji copy
I deepcopy
.
różnica między kopiami głębokimi i płytkimi
teraz, gdy omówiliśmy, czym są kopie płytkie i głębokie i dlaczego je tworzymy, nadszedł czas, aby porozmawiać o różnicy między nimi., Zasadniczo istnieją tylko dwie podstawowe różnice i są ze sobą powiązane:
- Deep copy przechowuje kopie wartości obiektu, podczas gdy shallow copy stories odwołuje się do oryginalnego adresu pamięci
- Deep copy nie odzwierciedla zmian dokonanych w nowym/skopiowanym obiekcie w oryginalnym obiekcie; podczas gdy shallow copy robi
zanim przejdziemy do implementacji, chciałbym, abyś sobie wyobrazić ten scenariusz. Powiedzmy, że dwie osoby chcą się napić; mają dwie puste szklanki i dwie słomki., Mogą dzielić się tym napojem na dwa sposoby:
- włóż napój do jednej szklanki i włóż obie Słomki do szklanki do dzielenia się
- włóż napój do obu szklanek i włóż jedną słomkę do każdej szklanki
pierwszy scenariusz to płytka Kopia. Obie zmienne / instancje wskazują / używają tego samego miejsca pamięci dla swoich operacji. Drugi scenariusz to głęboka Kopia. Obie zmienne / instancje wskazują / używają dwóch różnych miejsc pamięci do swoich operacji.,
przykład porównania
aby wyjaśnić różnicę, użyjmy tych informacji w naszych dwóch powyższych przykładach, zaczynając od przykładu 1.
powyżej stworzyliśmy listę result_A
i zrobiliśmy jej głęboką kopię o nazwie result_B
. Spróbujmy zmienić zawartość w result_B
I sprawdzić, czy ma to jakikolwiek wpływ na zawartość result_A
.
Output:
Original List:, ]Deep Copy:, ]
oczekiwany wynik jest taki, że oryginalna lista pozostaje bez zmian., Jak widać, zmiany w głębokiej kopii nie wpłynęły na oryginalną listę.
teraz spróbujmy tego samego z przykładem 2 – Shallow Copy.
Output:
Original List:, ]Shallow Copy:, ]
tutaj oczekiwany wynik jest taki, że zarówno oryginalna lista, jak i skopiowana lista są modyfikowane po pojedynczej zmianie. I jak widać, dokonanie zmiany w płytkiej kopii spowodowało, że zmiana ta znalazła odzwierciedlenie również w oryginalnej liście.
podsumowanie
w tym poście rozmawialiśmy o tym, czym jest płytka i głęboka kopia i jak możemy je wykonać w języku Python za pomocą modułu 'copy'., Użyliśmy dwóch jego funkcji, tj. copy
I deepcopy
do tworzenia płytkich i głębokich kopii. Ponadto omówiliśmy dwie podstawowe różnice między płytką i głęboką kopią, a także zaimplementowaliśmy płytką i głęboką kopię w Pythonie, aby lepiej zrozumieć te różnice.