poprzedni rozdział: Zestawy i zamrożone Zestawy
następny rozdział: funkcje

Shallow and Deep Copy

wprowadzenie


Jak widzieliśmy w rozdziale „typy danych i zmienne”, Python ma dziwne zachowanie – w porównaniu z innymi językami programowania – podczas przypisywania i kopiowania prostych danych typy takie jak liczby całkowite i ciągi znaków. Różnica między kopiowaniem płytkim a głębokim ma znaczenie tylko dla obiektów złożonych, które są obiektami zawierającymi inne obiekty, takie jak listy lub instancje klas.,
w poniższym fragmencie kodu y wskazuje na tę samą lokalizację pamięci niż X. zmienia się to, gdy przypisujemy inną wartość do y. w tym przypadku y otrzyma oddzielną lokalizację pamięci, jak widzieliśmy w rozdziale „typy danych i zmienne”.

>>> x = 3>>> y = x

ale nawet jeśli to wewnętrzne zachowanie wydaje się dziwne w porównaniu z językami programowania, takimi jak C, C++ i Perl, to jednak obserwowalne wyniki zadań odpowiadają na nasze oczekiwania. Ale może to być problematyczne, jeśli skopiujemy zmienne obiekty, takie jak listy i słowniki.
Python tworzy prawdziwe kopie tylko wtedy, gdy musi, tzn., jeśli użytkownik, programista, wyraźnie tego wymaga.
przedstawimy Ci najważniejsze problemy, które mogą wystąpić podczas kopiowania obiektów mutowalnych, tj. podczas kopiowania list i słowników.

kopiowanie listy

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

w powyższym przykładzie prosta lista jest przypisana do kolorów1. W następnym kroku przypisujemy color1 do colors2. Następnie do colours2 przypisana jest nowa lista.
zgodnie z oczekiwaniami wartości barw1 pozostały bez zmian., Podobnie jak w naszym przykładzie w rozdziale „typy danych i zmienne” przydzielono nową lokalizację pamięci dla colours2, ponieważ przypisaliśmy do tej zmiennej zupełnie nową listę.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

ale pytanie, co się stanie, jeśli zmienimy element listy kolorów2 lub kolorów1?
w powyższym przykładzie przypisujemy nową wartość drugiemu elementowi colours2. Wielu początkujących będzie zaskoczonych, że lista kolorów1 również została” automatycznie ” zmieniona.,
Wyjaśnienie jest takie, że nie ma nowego przypisania do colours2, tylko do jednego z jego elementów.

Kopiowanie za pomocą operatora Slice

możliwe jest całkowite kopiowanie płytkich struktur listy za pomocą operatora slice bez żadnych efektów ubocznych, które opisaliśmy powyżej:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

ale gdy tylko lista zawiera podlisty, mamy tę samą trudność, tzn. tylko wskaźniki do tych list.,

>>> lst1 = ]>>> lst2 = lst1

to zachowanie jest przedstawione na poniższym diagramie:

Jeśli przypisasz nową wartość do 0 elementu jednej z dwóch List, nie będzie żadnych skutków ubocznych. Problemy pojawiają się, jeśli zmienisz jeden z elementów sublisty.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

poniższy schemat przedstawia, co się stanie, jeśli jeden z elementów sublisty zostanie zmieniony: zarówno zawartość lst1, jak i lst2 zostaną zmienione.,

za pomocą metody deepcopy from the module copy

rozwiązaniem opisanych problemów jest użycie modułu „copy”. Moduł ten zapewnia metodę „copy”, która pozwala na pełną kopię dowolnej listy, tj. płytkiej i innych list.
poniższy skrypt wykorzystuje nasz przykład powyżej i tę metodę:

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

jeśli zapiszemy ten skrypt pod nazwą deep_copy.py a jeśli wywołamy skrypt z ” python deep_copy.,py”, otrzymamy następujące wyjście:

$ python deep_copy.py ]]

poprzedni rozdział: Zestawy i zamrożone Zestawy
następny rozdział: funkcje

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *