__del__ problem - would adopting Garbage Collection fix this?

Neil Schemenauer nascheme at enme.ucalgary.ca
Thu Apr 20 00:50:09 EDT 2000


Greg Ewing <greg at cosc.canterbury.ac.nz> wrote:
>By the way, does anyone know what the recently
>announced GC patch does about __del__ methods?

Well, I guess I should. :)

When garbage is found by the collector (ie. reference cycles not
reachable from Python), all objects reachable from __del__
methods are moved into a separate set.  This is what I call
uncollectable garbage.  Uncollectable instances are currently
added to a global list of uncollectable objects reachable from
within Python.  If the programmer creates such garbage it is up
to them to deal with it.

The bottom line is don't add __del__ methods to objects that form
cycles.  It is, however, okay to reference objects with __del__
methods from objects involved in reference cycles.  If that's not
clear perhaps an example will help:

    >>> import gc
    >>> class A:
    ...     pass
    ... 
    >>> class B:
    ...     def __del__(self):
    ...         pass
    ... 
    >>> a = A()
    >>> a.b = B() # referenced from, not involved in cycle
    >>> c = A()
    >>> a.c = c
    >>> c.a = a
    >>> del a, c # collectable garbage created
    >>> gc.collect()
    gc: collectable <Object 0x81c6a24>
    gc: collectable <A instance at 81c6a04>
    gc: collectable <Object 0x81c699c>
    gc: collectable <A instance at 81c697c>
    4
    >>> a = A()
    >>> b = B()
    >>> a.b = b
    >>> b.a = a
    >>> del a, b # uncollectable garbage created
    >>> gc.collect()
    gc: uncollectable <Object 0x81c351c>
    gc: uncollectable <A instance at 81abbc4>
    gc: uncollectable <Object 0x81abbe4>
    gc: uncollectable <B instance at 81c50a4>
    4
    >>> gc.garbage
    [<__main__.A instance at 81abbc4>, <__main__.B instance at
    81c50a4>]


There was quite a bit of discussion about this issue on the
python-dev list.

Getting back on topic, GC does not help with this problem.  In
fact it is hard to make __del__ methods behave sanely with GC.
Nice __del__ semantics are one of the benefits of reference
counting.  __del__ methods are strong medicine, use them
sparingly.


    Neil

-- 
"A language that doesn't affect the way you think about programming, is
not worth knowing" -- Alan Perlis



More information about the Python-list mailing list