Чем отличаются сильные и слабые ссылки в Python?

Ответ

Основное различие между сильными и слабыми ссылками заключается в их влиянии на сборщик мусора (Garbage Collector) Python.

  • Сильная ссылка (strong reference) — это стандартная ссылка на объект. Она увеличивает счётчик ссылок объекта. Пока существует хотя бы одна сильная ссылка, сборщик мусора не удалит объект из памяти.

  • Слабая ссылка (weak reference) — это ссылка, которая не увеличивает счётчик ссылок. Она позволяет получить доступ к объекту, но не мешает сборщику мусора удалить его, если на него не останется сильных ссылок.

Слабые ссылки создаются с помощью модуля weakref.

Практический пример

import weakref

class MyObject:
    def __init__(self, name):
        self.name = name
        print(f"Объект {self.name} создан")

    def __del__(self):
        # Этот метод вызывается при удалении объекта
        print(f"Объект {self.name} удален")

# 1. Создаем объект и сильную ссылку на него
obj = MyObject("A")

# 2. Создаем слабую ссылку на тот же объект
weak_obj_ref = weakref.ref(obj)

# 3. Доступ к объекту через слабую ссылку осуществляется вызовом
print(f"Доступ через слабую ссылку: {weak_obj_ref()}")

# 4. Удаляем единственную сильную ссылку
print("Удаляем сильную ссылку 'obj'...")
del obj

# 5. Сборщик мусора удаляет объект, так как сильных ссылок не осталось
# Теперь слабая ссылка указывает на None
print(f"Доступ через слабую ссылку после удаления: {weak_obj_ref()}")

Когда это полезно?

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