Ответ
Основное различие между сильными и слабыми ссылками заключается в их влиянии на сборщик мусора (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()}")
Когда это полезно?
Слабые ссылки необходимы для реализации кэшей и для предотвращения циклических ссылок, когда два или более объектов ссылаются друг на друга, что мешает их удалению сборщиком мусора и приводит к утечкам памяти.