On 8/30/07, 7stud <[EMAIL PROTECTED]> wrote: > On Aug 30, 3:50 am, "Martin v. Löwis" <[EMAIL PROTECTED]> 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. > Doing some further testing, if I eliminate the __del__ methods: > > ----------- > import gc > > class Cat(object): > pass > > class Dog(object): > 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: collectable <Dog 0x56e10> > gc: collectable <Cat 0x56e30> > gc: collectable <dict 0x58270> > gc: collectable <dict 0x43e40> > [<__main__.Dog object at 0x56e10>, <__main__.Cat object at 0x56e30>, > {'cat': <__main__.Cat object at 0x56e30>}, {'dog': <__main__.Dog > object at 0x56e10>}] > ----- > > The docs say: > > --------- > garbage > A list of objects which the collector found to be unreachable but > could not be freed (uncollectable objects). > -------- > > Since debugging doesn't show any uncollectable objects, why isn't > gc.garbage empty? The docs also say: > > ---- > garbage > ...By default, this list contains only objects with __del__() methods. > ---- > > Does set_debug() change the default? > >From the last line of the documentation block you quoted above: "If DEBUG_SAVEALL is set, then all unreachable objects will be added to this list rather than freed." -- http://mail.python.org/mailman/listinfo/python-list