[IPython-user] question about garbage collection

Fernando Perez fperez.net@gmail....
Sun Jul 13 02:48:37 CDT 2008

Hey Kilian,

On Sun, Jul 13, 2008 at 12:08 AM, killian koepsell <koepsell@gmail.com> wrote:
> Hi,
> I noted the following behavior in ipython: If you run the following
> few lines in ipython, an object is created and destroyed:
> In [1]: class C(object):
>  ...:     def __del__(self):
>  ...:         print 'deleting object...'
>  ...:
>  ...:
> In [2]: obj = C()
> In [3]: del obj
> deleting object...
> The same, of course, works if you run theses line within a script that
> is called from ipython. If you don't delete the
> object at the end of the script, it is available afterwards in
> ipython. For some reason, the object destructor doesn't
> seem to be called when the object is later deleted. It seems that even
> after deleting the object, there is still some
> reference to that object around somewhere. Is this the expected/wanted
> behavior? Is it possible to force a complete
> destruction of the object in order to free the used memory?

If your object isn't getting deleted, likely it's because there are
other references to it:

In [4]: class C(object):
   ...:     def __del__(self):
   ...:         print 'deleting'

In [5]: c=C()

This works OK:
In [6]: del c

But in this case:
In [7]: c=C()

If we have another reference:
In [8]: b=c

Deleting c doesn't  do the trick:
In [9]: del c

It only goes away after we also delete b:
In [10]: del b

Note that in IPython, references are held to objects in lots of places:

In [23]: class C(object):
    def __del__(self):
        print 'deleting'

In [26]: c=C()

In [27]: c
Out[27]: <__main__.C object at 0x862262c>

In [28]: %reset
Once deleted, variables cannot be recovered. Proceed (y/[n])?  y

The deletion hasn't happened yet!

We have to try harder:

In [30]: del _27

In [31]: del Out[27]

In [32]: del ___

In [33]: import gc

In [34]: gc.collect()
Out[34]: 92


So, in addition to using %reset and gc.collect(), I'd encourage you to
file a ticket for us to make %reset more robust.  It really needs to
go deeper in cleanup mode.

Finally, you must keep in mind that __del__ methods aren't guaranteed
to be called, even absent ipython quirks.  See


for details.



More information about the IPython-user mailing list