gc.garbage

Chris Mellon arkanes at gmail.com
Thu Aug 30 16:38:14 EDT 2007


On 8/30/07, 7stud <bbxx789_05ss at yahoo.com> wrote:
> 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.
>

What happens when you print a dictionary?

>
> > 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:
>

Anything that the gc would have collected.

> -----
> y = Cat()
> del y
> -----
>
> That object doesn't make it into gc.garbage.

Because it's already dead. In your previous code, you made dog and cat
unreachable by virtue of making them a refcycle.

>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list