import weakref class C: __slots__ = ['x', 'y', '__weakref__'] def __init__(self): self.x = None def setY(self): if self.x.x: self.y = D(weakref.ref(self.x.x)) class D: def __init__(self, wr): self.wr = wr def __del__(self): o = self.wr() root = c = C() for n in range(100): c.x = c = C() c = root while c.x: c.setY() c = c.x print('deleting') del root print('done')