Recursive calls and stack

Gabriel Genellina gagsl-py at yahoo.com.ar
Wed Feb 14 03:16:29 EST 2007


En Wed, 14 Feb 2007 04:23:46 -0300, jm.suresh at no.spam.gmail.com  
<jm.suresh at gmail.com> escribió:

> I am OK with calls being stacked, but I wondering will the local
> variables be stacked given that return statement is followed by the
> function call?
>
> def test():
>   x = 22
>   y = 33
>   z = x+y
>   return anotherFunction(z)
>
> In this function will all the local variables (x,y,z) be pushed into
> the stack before calling anotherFunction(z) or Python will find out
> that the locals are no longer needed as anotherFunction(z) is just
> returned?

Not exactly like "pushed into the stack", but there exists a frame object,  
and it contains references to its local variables, and will be alive until  
anotherFunction returns. From inside anotherFunction you can even inspect  
those variables:

py> def test():
...   x = 22
...   y = 33
...   z = x+y
...   return anotherFunction(z)
...
py> def anotherFunction(z):
...   print "previous frame:", sys._getframe(1).f_locals
...
py> test()
previous frame: {'y': 33, 'x': 22, 'z': 55}

So x,y,z will still be there until anotherFunction actually returns to  
test, and the frame object is disposed. For a highly recursive function,  
that's bad news. For debugging normal programs, that's good news; the  
cgitb module, by example, is able to show the values for local variables  
in all previous frames when an exception is raised.

-- 
Gabriel Genellina




More information about the Python-list mailing list