🤔 Как работает память в питоне?



Работа с памятью в Python основывается на управлении объектами, сборке мусора и использовании кучи (heap) для динамического распределения памяти.



🚩Концепции управления памятью



🟠Объекты и их управление

В Python все является объектом, включая числа, строки, функции и классы. Каждый объект состоит из двух частей: заголовка и данных. Заголовок включает тип объекта и счетчик ссылок, а данные содержат значение объекта.



🟠Куча (Heap)

Все объекты в Python хранятся в куче, которая управляется интерпретатором. Куча используется для динамического распределения памяти, что позволяет эффективно управлять памятью.



🟠Счетчик ссылок

Python использует счетчик ссылок для отслеживания, сколько раз объект используется в программе. Счетчик ссылок увеличивается при создании новой ссылки на объект и уменьшается при удалении ссылки. Когда счетчик ссылок объекта становится равным нулю, объект считается неиспользуемым и подлежит удалению.



🟠Сборка мусора (Garbage Collection)

Python использует механизм сборки мусора для удаления неиспользуемых объектов и освобождения памяти. Основной алгоритм сборки мусора основан на циклическом сборе (cyclic garbage collection), который позволяет находить и удалять циклические ссылки (объекты, которые ссылаются друг на друга).



🚩Как работает



🟠Счетчик ссылок

Когда объект создается, его счетчик ссылок устанавливается в 1. При создании новой ссылки на объект счетчик увеличивается на 1, при удалении ссылки — уменьшается на 1. Когда счетчик ссылок становится равным нулю, объект удаляется, а память освобождается.



🟠Циклический сборщик мусора

Основной сборщик мусора Python способен обнаруживать циклические ссылки, которые невозможно удалить с помощью простого счетчика ссылок. Сборщик мусора периодически просматривает объекты и их ссылки, чтобы найти циклы и удалить неиспользуемые объекты.



import sys



# Создание объекта и проверка счетчика ссылок

a = [1, 2, 3]

print(sys.getrefcount(a)) # Обычно возвращает 2, так как есть ссылка a и временная ссылка для вызова функции



# Увеличение счетчика ссылок

b = a

print(sys.getrefcount(a)) # Теперь возвращает 3, так как есть ссылки a, b и временная ссылка для вызова функции



# Уменьшение счетчика ссылок

del b

print(sys.getrefcount(a)) # Теперь возвращает 2, так как ссылка b удалена



# Сборка мусора

import gc



# Принудительный запуск сборщика мусора

gc.collect()




Ставь 👍 и забирай 📚 Базу знаний