import pickle import io import gc import weakref class MyPickler(pickle.Pickler): def persistent_id(self, obj): return None def test_cycle(): pickler = MyPickler(io.BytesIO()) r = weakref.ref(pickler) del pickler if r() is not None: print("Oops, still here") gc.collect() if r() is None: print("Now it's gone") def test_break_cycle(): pickler = MyPickler(io.BytesIO()) r = weakref.ref(pickler) # Note: the following line doesn't break the cycle #pickler.persistent_id = lambda obj: None pickle.Pickler.persistent_id.__set__(pickler, lambda obj: None) del pickler if r() is None: print("breaking persistent_id cycle worked") if __name__ == '__main__': test_cycle() test_break_cycle()