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))