[Python-Dev] Product iteration

Guido van Rossum guido@beopen.com
Wed, 26 Jul 2000 08:12:20 -0500


> > Hm... hmmmm... fixing this has been suggested before, but always
> > foundered on the fact that creating a closure required a cycle, which
> > would leak memory.  Now we have an optional GC that should handle
> > this, so maybe fixing it can be revisited.  (But this would mean that
> > GC is essentially no longer optional -- maybe too radical a thing to
> > do before we're sure about the new GC.  2.1, maybe?)
> 
> I think I'd rather have this solved by weak references then by building
> cycles. Cycles are evil even in the face of GC -- you have undetermined
> finalization.

But in this case, there aren't any custom finalizers involved in the
cycle (although there may be some *hanging off* the cycle).
E.g. after:

    def f():
	def g(): pass

    f()

we have (taking some notational liberties and simplifications):

    globals = {'f': f}
    f.func_globals = globals
    locals = {'g': g}
    g.func_globals = locals    # or maybe g.func_parent = locals

In other words the cycles are between a dictionary and a function
object:

    globals <--> f
    locals <--> g

I don't see any finalization issues.

--Guido van Rossum (home page: http://www.pythonlabs.com/~guido/)