On 8/30/07, 7stud <[EMAIL PROTECTED]> wrote: > On Aug 30, 12:36 pm, "Chris Mellon" <[EMAIL PROTECTED]> wrote: > > 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. > > > > > > 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 > -- http://mail.python.org/mailman/listinfo/python-list