В 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 очищаются, как только сборщик мусора запускается в первый раз.