Как разбирате референтния модел, върху който е базиран езикът за програмиране Python?
sobes.tech AI
Отговор от AI
В Python променливите са референции (връзки) към обекти в паметта, а не контейнери за самите стойности. Когато присвоим стойност на променлива, тя всъщност започва да сочи към обект, който съдържа тази стойност. При промяна на променлива, която сочи към изменяем обект (например списък или речник), самият обект, към който сочи променливата, се променя. При промяна на променлива, която сочи към неизменяем обект (например число, низ или кортеж), в паметта се създава нов обект и променливата започва да сочи към него.
# Неизменяем обект (int)
a = 10
b = a # a и b първоначално сочат към същия обект
print(id(a), id(b)) # Същият id
a = 20 # Създава нов обект 20, към който сочи a
print(id(a), id(b)) # Различни id, b все още сочи към 10
# Изменяем обект (списък)
list1 = [1, 2, 3]
list2 = list1 # и двата сочат към един и същи списък
print(id(list1), id(list2)) # Същият id
list1.append(4) # Модифицира обекта, към който сочат и двата
print(list1)
print(list2) # И двата списъка са променени
print(id(list1), id(list2)) # Още същият id
Механизмът за броене на референции се използва за автоматично управление на паметта. Всеки обект следи броя на променливите, които към него сочат. Когато този брой достигне нула, обектът става недостъпен, и събирачът на боклука освобождава заетата памет.
Важно отличие от езици с директно съхранение на стойности в променливите (например C) е, че в Python при b = a стойността на a не се копира в b, а b започва да сочи към същия обект като a.