Sobes.tech
Middle

Jak rozumiesz model referencyjny, na którym oparty jest język programowania Python?

sobes.tech AI

Odpowiedź od AI

W Pythonie zmienne są odwołaniami (referencjami) do obiektów w pamięci, a nie pojemnikami na same wartości. Gdy przypisujemy wartość do zmiennej, w rzeczywistości zaczyna ona wskazywać na obiekt zawierający tę wartość. Przy zmianie zmiennej, która odwołuje się do obiektu mutowalnego (np. listy lub słownika), zmienia się sam obiekt, na który wskazuje zmienna. Przy zmianie zmiennej odwołującej się do obiektu niemutowalnego (np. liczby, łańcucha znaków lub krotki), tworzony jest nowy obiekt w pamięci, a zmienna zaczyna wskazywać na niego.

# Obiekt niemutowalny (int)
a = 10
b = a # a i b początkowo odwołują się do tego samego obiektu
print(id(a), id(b)) # To samo id

a = 20 # Tworzy nowy obiekt 20, a wskazuje na niego
print(id(a), id(b)) # Różne id, b nadal odnosi się do 10

# Obiekt mutowalny (lista)
list1 = [1, 2, 3]
list2 = list1 # list1 i list2 odwołują się do tej samej listy
print(id(list1), id(list2)) # To samo id

list1.append(4) # Modyfikuje obiekt, na który wskazują oba
print(list1)
print(list2) # Obie listy są zmodyfikowane
print(id(list1), id(list2)) # Nadal to samo id

Mechanizm zliczania referencji jest używany do automatycznego zarządzania pamięcią. Każdy obiekt śledzi liczbę zmiennych, które na niego wskazują. Gdy liczba ta osiąga zero, obiekt staje się niedostępny, a garbage collector zwalnia zajmowaną przez niego pamięć.

Ważną różnicą w porównaniu do języków z bezpośrednim przechowywaniem wartości w zmiennych (np. C) jest to, że w Pythonie, przypisując b = a, nie kopiuje się wartości a do b, lecz b zaczyna wskazywać na ten sam obiekt, na który wskazuje a.