Python weakref provides references to objects that don't prevent garbage collection. If you hold a weak reference to an object and nothing else references it, the object is freed and the weak reference becomes invalid.
Use weak references to break circular references, implement caches that don't keep objects alive, or monitor when objects are deleted.
This example shows weak references breaking a circular reference that would otherwise create a memory leak.
# run: python3 weakref.py # description: weak references for circular reference management import weakref class Parent: def __init__(self, name): self.name = name self.children = [] def add_child(self, child): self.children.append(child) child.parent = weakref.ref(self) # weak reference to parent class Child: def __init__(self, name): self.name = name self.parent = None def parent_name(self): if self.parent is None: return "no parent" parent_obj = self.parent() # call weak ref to get object if parent_obj is None: return "parent was deleted" return parent_obj.name # Create parent and child p = Parent("Alice") c1 = Child("Bob") c2 = Child("Carol") p.add_child(c1) p.add_child(c2) print(f"c1 parent: {c1.parent_name()}") print(f"c2 parent: {c2.parent_name()}") # Delete parent; weak ref becomes invalid del p print(f"after deletion: {c1.parent_name()}") # With strong refs (circular), memory would leak # With weak refs, parent can be garbage collected
Creating weak references:
ref = weakref.ref(obj): create weak referenceobj = ref(): dereference (returns None if object was deleted)weakref.proxy(obj): returns proxy that raises ReferenceError if deletedCallback on deletion:
weakref.ref(obj, callback): call callback when object is garbage collectedWeak value dictionaries:
weakref.WeakValueDictionary(): dict that releases values when no other refs existWeak key dictionaries:
weakref.WeakKeyDictionary(): dict that releases entries when keys are deletedWhen to use:
Limitations:
__slots__ or custom __weakref__