Вопрос проверяет понимание механизма подсчёта ссылок и сборки мусора в Python, что важно для управления памятью и предотвращения утечек.
Python использует комбинацию двух основных механизмов для определения неиспользуемых объектов и освобождения памяти: подсчёт ссылок (reference counting) и циклический сборщик мусора (cyclic garbage collector).
Это основной и самый быстрый механизм. Каждый объект в Python (например, список, словарь, экземпляр класса) содержит скрытое поле — счётчик ссылок. Когда вы создаёте новую ссылку на объект (например, присваиваете переменную или добавляете в список), счётчик увеличивается на 1. Когда ссылка удаляется (переменная выходит из области видимости, присваивается новое значение или удаляется явно с помощью del), счётчик уменьшается на 1.
a = [] # Создан объект-список, счётчик = 1
b = a # Новая ссылка, счётчик = 2
del a # Удалена одна ссылка, счётчик = 1
b = None # Удалена последняя ссылка, счётчик = 0 → память освобожденаКак только счётчик достигает нуля, интерпретатор немедленно освобождает память, занимаемую объектом. Это происходит в момент выполнения кода, без задержек.
Подсчёт ссылок не может справиться с циклическими ссылками, когда объекты ссылаются друг на друга, но внешних ссылок на них уже нет. Например:
class Node:
def __init__(self):
self.ref = None
node1 = Node()
node2 = Node()
node1.ref = node2 # node1 ссылается на node2
node2.ref = node1 # node2 ссылается на node1 — цикл
# Удаляем внешние ссылки
node1 = None
node2 = None
# Теперь оба объекта имеют счётчик ссылок = 1 (друг на друга), но недоступны из программыДля таких случаев Python включает дополнительный механизм — циклический сборщик мусора (GC). Он работает периодически, отслеживая группы объектов, которые могут ссылаться друг на друга, и находит циклы, не достижимые из корневых объектов (например, глобальных переменных, стека вызовов). Обнаруженные циклы затем удаляются.
Механизм сборки мусора в Python обычно работает автоматически, но разработчик может влиять на него:
del для явного удаления ссылок на крупные объекты, когда они больше не нужны.gc позволяет вручную управлять сборщиком: отключать/включать, запускать сборку, настраивать пороги.with) или явно вызывать методы закрытия, так как сборщик мусора не гарантирует моментального освобождения таких ресурсов.Вывод: Python в основном полагается на подсчёт ссылок для немедленного освобождения памяти, а циклический сборщик мусора служит страховкой для сложных случаев с циклами. Понимание этого механизма помогает писать более эффективный код, особенно при работе с большими структурами данных или долгоживущими приложениями, где важно избегать утечек памяти.