Memory Leak ['LBBW': checked]

Jeff Epler jepler at unpythonic.net
Wed Feb 25 09:59:28 EST 2004


On Wed, Feb 25, 2004 at 03:18:33PM +0100, Holger Joukl wrote:
> 2) I am quite stunned by the del alist[:] thing:
> >>> class foo:
> ...     def __del__(self):
> ...             print "foo.__del__"
> ...
> >>> alist=[foo(), foo(), foo()]
> >>> del alist[:]
> foo.__del__
> foo.__del__
> foo.__del__
> >>> alist
> []
> alist[:] creates a shallow copy of alist, which is a new object. del then
> decreases the refcount of this
> temporary object, thus it is destroyed. But why is the original alist empty
> after that, why are the
> list elements destroyed?
> Does that mean if a shallow copy of a list is created, the refcounts of the
> elements in the list are not increased?

"del alist[:]" does not get a slice of alist and then delete the resulting
copy.  del can work on names ("del a"), attributes ("del o.x") and slices
("del l[:]").  The following part of an interactive session shows that
__delslice__, not __getslice__ is called for "del c[:]".

>>> class C:
...     def __getslice__(self, *args): print "getslice", args
...     def __delslice__(self, *args): print "delslice", args
... 
>>> c = C()
>>> c[:]
getslice (0, 2147483647)
>>> del c[:]
delslice (0, 2147483647)

Jeff




More information about the Python-list mailing list