Сборка мусора в Python
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Основы «Python»
Комментариев: 0

В Python существует возможность по сборке мусора, этот механизм позволяет управлять памятью. Давайте рассмотрим аспекты сбора мусора в примерах.

Что такое сборка мусора в Python?

Сборка мусора в Python — это процесс очистки оперативной памяти компьютера, используемой в настоящее время работающей программой, когда эта память ей больше не нужна. Сборка мусора очищает этот блок памяти, чтобы другие программы (или та же программа) могли снова использовать его.

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

class Student(object):

    def __del__(self):
        print(f'Ссылок больше нет: {self}')


user1 = Student()
user2 = user1
user3 = user1

Результат:

Ссылок больше нет: <__main__.Student object at 0x000002D2C5E07940>

А теперь присвоим переменным = None

class Student(object):

    def __del__(self):
        print(f'Ссылок больше нет {self}')


user1 = Student()
user2 = user1
user3 = user1

user1 = None
user2 = None
user3 = None

Результат:

Ссылок больше нет <__main__.Student object at 0x000002259AEA7940>

После того, как мы установили для последней переменной user3 значение None, объект очищается и вызывается функция __del__.

Сборка мусора запускается автоматически, когда программа находится в процессе выполнения, иногда нам может потребоваться запустить сборку мусора в определенное время. Мы можем сделать это, вызвав функцию collect().

Давайте попробуем определить класс с функцией collect(), чтобы продемонстрировать это:

import gc
import pprint


class LinkObjects(object):

    def __init__(self, name):
        self.name = name
        self.next = None

    def set_next(self, next):
        print(f'Связывающие узлы {self}.next = {next}')
        self.next = next

    def __repr__(self):
        return f'{self.__class__.__name__}, {self.name}'


# Построение круговых LinkObjects
a = LinkObjects('22')
b = LinkObjects('33')
c = LinkObjects('44')

a.set_next(b)
b.set_next(c)
c.set_next(a)

# Удаление ссылок
a = b = c = None

# Эффект сбора мусора

for i in range(2):
    print('Сбор:', i)
    n = gc.collect()
    print('Недоступные объекты:', n)
    print('Оставшийся мусор:', pprint.pprint(gc.garbage))

Результат выполнения:

Связывающие узлы LinkObjects, 22.next = LinkObjects, 33
Связывающие узлы LinkObjects, 33.next = LinkObjects, 44
Связывающие узлы LinkObjects, 44.next = LinkObjects, 22
Сбор: 0
Недоступные объекты: 6
[]
Оставшийся мусор: None
Сбор: 1
Недоступные объекты: 0
[]
Оставшийся мусор: None

В этом примере циклические объекты LinkObject очищаются, как только сборщик мусора запускается в первый раз.

Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)