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:

  1. Deep copy przechowuje kopie wartości obiektu, podczas gdy shallow copy stories odwołuje się do oryginalnego adresu pamięci
  2. 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:

  1. włóż napój do jednej szklanki i włóż obie Słomki do szklanki do dzielenia się
  2. 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.