[Python-Dev] Garbage collecting closures

Guido van Rossum guido@python.org
Mon, 14 Apr 2003 12:08:04 -0400


> On Mon, 2003-04-14 at 11:52, Phillip J. Eby wrote:
> > If I understand correctly, it should also be breakable by deleting 'foo' 
> > from the outer function when you're done with it.  E.g.:
> > 
> > def bar(a):
> >       def foo():
> >           return None
> >           x = a
> >           foo()
> > 
> >       del foo   # clears the cell and breaks the cycle

> From: Jeremy Hylton <jeremy@zope.com>
> 
> You haven't tried this, have you? ;-)
> 
> SyntaxError: can not delete variable 'foo' referenced in nested scope
> 
> Since foo() could escape bar, i.e. become reachable outside of bar(), we
> don't allow you to unbind foo.

I don't see the reason for this semantic restriction.  IMO it could
just as well be a runtime error (e.g. raising UnboundLocalError).

--Guido van Rossum (home page: http://www.python.org/~guido/)