Sobes.tech
Middle

Wie funktioniert der Garbage Collector in Python? Wenn eine Speicherzelle auf eine andere Speicherzelle verweist, löscht der GC beide Referenzen oder löscht er keine?

sobes.tech KI

Antwort von AI

В Python сборщик мусора (garbage collector, GC) работает на основе подсчёта ссылок и дополнительно использует алгоритм обнаружения циклических ссылок.

  • Каждый объект хранит счётчик ссылок — количество активных ссылок на него.
  • Когда счётчик становится 0, объект сразу удаляется.
  • Однако, если объекты ссылаются друг на друга циклично, но не доступны из программы, счётчики не становятся 0.
  • Для таких случаев Python запускает циклический сборщик, который ищет и удаляет циклы объектов, недоступных из кода.

Если ячейка памяти (объект) ссылается на другую, GC не удалит обе, если на них ещё есть внешние ссылки. Если же обе связаны циклом и недоступны, то циклический GC удалит весь цикл целиком.

Пример:

import gc

a = []
b = [a]
a.append(b)

# a и b ссылаются друг на друга, создавая цикл
# Если удалить внешние ссылки:
del a
# b всё ещё существует

del b

# Теперь цикл недоступен, GC может его собрать
gc.collect()