[Python-Dev] Deletion order when leaving a scope?

Neil Toronto ntoronto at cs.byu.edu
Thu Jan 18 18:04:42 CET 2007


Thomas Wouters wrote:
> On 1/18/07, *Larry Hastings* <larry at hastings.org 
> <mailto:larry at hastings.org>> wrote:
>
>
>
>     I just ran a quickie experiment and determined: when leaving a
>     scope, variables are deleted FIFO, aka in the same order they were
>     created.  This surprised me; I'd expected them to be deleted LIFO,
>     aka last first.  Why is it thus?  Is this behavior an important
>     feature or an irrelevant side-effect?
>
>
> Please regard it as an irrelevant side-effect. If you want objects to 
> be cleaned up in a particular order, you should enforce it by having 
> one of them refer to the other. A great many details can affect the 
> order in which variables are cleaned up, and that only decreases 
> refcounts of the actual objects -- a great many other details can then 
> affect the order in which any objects left with a 0 refcount are 
> actually cleaned up. Even not counting the more complicated stuff like 
> GC and funky __del__ methods, just having 'import *' or a bare 'exec' 
> in your function can change the order of DECREFs.

I imagine this would be important to someone expecting system resources 
to be cleaned up, closed, deallocated, or returned inside of __del__ 
methods. Someone coming from C++ might expect LIFO behavior because 
common idioms like RAII (Resource Allocation Is Instantiation) don't 
work otherwise. A Java programmer wouldn't care, being used to cleaning 
up resources manually with a try...catch...finally.

I'm just putting a possible motivation on the concern. It happens that 
the Pythonic Way is also the Java Way in this area: don't expect any 
specific deletion order (don't even expect a guaranteed call to 
__del__), and manually clean up after yourself. As a warning, this has 
been the subject of a great many flame wars between C++ and Java 
programmers...

Neil



More information about the Python-Dev mailing list