Wow: list of immediate subclasses?

Andrew Dalke adalke at mindspring.com
Fri Aug 1 04:56:01 EDT 2003


Carl Banks, responding to Roman Suzi:
> __subclasses__ is a list of weak references, so the class can be
> collected even though it's listed in __subclasses__.  For whatever
> reason, class A isn't deleted by reference counts, but cyclic garbage
> collection gets it.

But I want to know that reason.  Why are there any cycles?  After
all, don't weak-references help break cycles?  And in my code
before, why do I need to do the gc a few times to force the cycle
to be broken?

>>> float.__subclasses__()
[]
>>> class Spam(float): pass
...
>>> float.__subclasses__()
[<class '__main__.Spam'>]
>>> del Spam
>>> _ = None  # just in case ...
>>> float.__subclasses__()
[<class '__main__.Spam'>]
>>> gc.collect()
0
>>> float.__subclasses__()
[<class '__main__.Spam'>]
>>> gc.collect()
0
>>> float.__subclasses__()
[<class '__main__.Spam'>]
>>> gc.collect()
0
>>> gc.collect()
6
>>> gc.collect()
0
>>> float.__subclasses__()
[]
>>>

It's a bit too mysterious for my liking.

                    Andrew
                    dalke at dalkescientific.com






More information about the Python-list mailing list