What is a reference cycle in python? What is a reference cycle in python? python python

What is a reference cycle in python?


A reference cycle simply means one or more objects referencing each other, such that if you drew it out on paper with arrows representing the dependencies you would see a cycle.

The (almost) simplest reference cycle is having two objects a and b that refer to each other:

a.other = bb.some_attr = a

Naive garbage collectors work strictly off of whether or not an object is referenced by another object. In this case, if both a and b are not referred to by anything else, they still refer to each other and a naive garbage collector may not reclaim the memory. (I don't know if Python can be trapped by reference cycles or not, though.)

EDIT: The simplest reference cycle is an object that refers to itself:

a = []a.append(a)


This is a reference cycle:

l = []l.append(l)

The first element of l, i.e. l[0], is now a cyclic reference to l itself.


>>> aRef = []>>> aRef.append(aRef)>>> print aRef[[...]]

This creates a list object referred by a variable namedaRef. the first element in the list object is a reference to itself. In this case, the del aRef dereference aRef to the list object. However, the reference count of the list object does not decrease to zero and the list object is not garbage collected, since the list object still refers to itself. In this case, the garbage collector in Python will periodically check if such circular references exist and the interpreter will collect them. The following is an example to manually collect the space used by circular referenced objects.

>>> import gc>>> gc.collect()0>>> del aRef>>> gc.collect()1>>> gc.collect()0