Pablo Galindo Salgado <pablog...@gmail.com> added the comment:
I think this is a good summary of what you are referring to: >>> import gc, weakref >>> class Lazarus: ... def __del__(self): ... global x ... x = self ... >>> def callback(*args): ... print("DEAD") ... # No gc dead: >>> x = None >>> a = Lazarus() >>> w = weakref.ref(a, callback) >>> del a # Notice that the callback has not been executed >>> del x DEAD # Gc code: >>> a = Lazarus() >>> x = None >>> cycle = [] >>> cycle.append(cycle) >>> cycle.append(a) >>> w = weakref.ref(a, callback) >>> del a,cycle >>> gc.collect() DEAD >>> x. #The callback has executed but the variable is still alive <__main__.Lazarus object at 0x1020e9910> The "problem" is that when going through the gc, the callback is executed when the object is resurrected but going through normal refcount the callback is executed only when the object dies. Notice that in both cases the fundamental property still holds: the callback is executed *once*. What you are discussing now is a matter of *when*. Not sure if we want to homogenize both code paths, but changing the one that goes through the GC is going to be challenging to say the least because as Tim mentioned, the weakrefs semantics are *very* delicate. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue40312> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com