gc.garbage

7stud bbxx789_05ss at yahoo.com
Thu Aug 30 22:30:27 CEST 2007


On Aug 30, 12:36 pm, "Chris Mellon" <arka... at gmail.com> wrote:
> On 8/30/07, 7stud <bbxx789_0... at yahoo.com> wrote:
>
> > On Aug 30, 3:50 am, "Martin v. Löwis" <mar... at v.loewis.de> wrote:
> > > > gc.set_debug(gc.DEBUG_LEAK)
> > > > print gc.garbage
>
> > > > --output:--
> > > > []
> > > > gc: uncollectable <Dog 0x56e10>
> > > > gc: uncollectable <Cat 0x56e30>
> > > > gc: uncollectable <dict 0x58270>
> > > > gc: uncollectable <dict 0x43e40>
>
> > > gc.garbage is filled only after these messages
> > > are printed, not before. You need to add an explicit
> > > call to gc.collect() if you want to see what
> > > uncollectable garbage you have.
>
> > > Regards,
> > > Martin
>
> > Hi,
>
> > Thanks for the response.  I had a cut and paste error in my reply, so
> > here it is again with the corrections...
>
> > Now, if I run the code:
>
> > ------------
> > import gc
>
> > class Cat(object):
> >     def __del__():
> >         pass
>
> > class Dog(object):
> >     def __del__():
> >         pass
>
> > def some_func():
> >     the_dog = Dog()
> >     the_cat = Cat()
> >     the_dog.cat = the_cat
> >     the_cat.dog = the_dog
>
> > some_func()
>
> > gc.set_debug(gc.DEBUG_LEAK)
> > gc.collect()
> > print gc.garbage
> > -----------
>
> > I get this output:
>
> > ----------
> > gc: uncollectable <Dog 0x56e10>
> > gc: uncollectable <Cat 0x56e30>
> > gc: uncollectable <dict 0x58300>
> > gc: uncollectable <dict 0x43e40>
> > [<__main__.Dog object at 0x56e10>, <__main__.Cat object at 0x56e30>,
> > {'cat': <__main__.Cat object at 0x56e30>}, {'dog': <__main__.Dog
> > object at 0x56e10>}]
> > -----------
>
> > Why are there two entries in the list for each uncollectable
> > object(same addresses)?  Also, I haven't bound the names "cat" or
> > "dog" anywhere in my program.  What do those names mean in the list?
>
> Read your output carefully!
>
> gc.garbage is a list of objects. The objects are printed just as they
> would be anywhere else in Python. You've got the dog object, the cat
> object, and the __dict__ of each instance.
>
>

Ah.  I missed the braces inside the list, but I still don't understand
where the names "cat" and "dog" come from.


> DEBUG_SAVEALL is set, then all unreachable objects will be added to
> this list rather than freed."

What is the definition of an "unreachable object"?  If I add the
following:

-----
y = Cat()
del y
-----

That object doesn't make it into gc.garbage.




More information about the Python-list mailing list