On Aug 30, 3:50 am, "Martin v. Löwis" <mar...@v.loewis.dewrote:
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?
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?