Python: typy mutable, immutable i metoda copy()

9-mar-2020

W Pythonie występują typy mutable i immutable.

Immutable – niezmienne – typy takie jak int, float, bool, str. Zmienna wskazuje na komórkę w pamięci, ale kiedy do tej zmiennej wstawiasz nową wartość, to dla zmiennej rezerwuje się nową komórkę i tam przechowuje się jej wartość. Funkcja id() pozwala zmieniać adres tej komórki. W skrypcie poniżej początkowo i oraz new_i wskazują na tą samą wartość komórki, ale potem, po zmianie i, funkcja id() zwraca inne wartości dla każdej zmiennej. Immutable – wartość komórki pamięci się nie zmienia

i = 0
new_i = i

print(id(i), id(new_i)) 
i = 10

print(i, new_i)
print(id(i), id(new_i))

Mutable – zmienne – typy takie jak listy, zbiory, słowniki. Zmienna wskazuje na pewne miejsce w pamięci. Jeśli zmienia się wartość zmiennej (np. dodaje element do listy), to adres komórki zostaje ten sam, ale zmienia się zawartość struktury pamięciowej. Tutaj box i new_box, to właściwie to samo. Funkcja id() zwraca dokładnie ten sam identyfikator. Jeśli do box dodasz nowy element, to pojawi on się też w new_box. Mutable – wartość komórki pamięci się zmienia:

box = ['ab','bcd','cde']
new_box = box

print(id(box), id(new_box))
box.append('fgh')

print(box, new_box)
print(id(box), id(new_box))

Takie działanie typów mutable bywa niekiedy niepożądane i dlatego mamy do dyspozycji funkcję copy(). Ta metoda bierze oryginalny obiekt z pamięci i kopuje go w inne miejsce w pamięci, tworząc nową zmienną. Funkcja id() wywoływana dla zmiennej utworzonej poprzez copy() zwróci inną wartość, a co za tym idzie oba obiekty są różnymi obiektami i można je modyfikować niezależnie:

box = ['ab','bcd','cde']
another_box = box.copy()

print(id(box), id(another_box))
box.append('klm')

print(box, another_box)
print(id(box), id(another_box))

Komentarze są wyłączone

Autor: Rafał Kraik