[Python-ideas] For-loop variable scope: simultaneous possession and ingestion of cake
aahz at pythoncraft.com
Fri Oct 3 16:31:45 CEST 2008
On Fri, Oct 03, 2008, Greg Ewing wrote:
> Previous proposals to make for-loop variables local to the loop have
> stumbled on the problem of existing code that relies on the loop
> variable keeping its value after exiting the loop, and it seems that
> this is regarded as a desirable feature.
Very yes, I use this constantly.
> So I'd like to propose something that would satisfy
> both requirements:
> 0. There is no change if the loop variable is not
> referenced by a nested function defined in the loop
> body. The vast majority of loop code will therefore
> be completely unaffected.
> 1. If the loop variable is referenced by such a nested
> function, a new local scope is effectively created
> to hold each successive value of the loop variable.
> 2. Upon exiting the loop, the final value of the loop
> variable is copied into the surrounding scope, for
> use by code outside the loop body.
> Rules 0 and 1 would also apply to list comprehensions
> and generator expressions.
> There is a very simple and efficient way to implement
> this in current CPython: If the loop variable is referenced
> by a nested function, it will be in a cell. Instead of
> rebinding the existing cell, each time around the loop
> a new cell is created, replacing the previous cell.
> Immediately before exiting the loop, one more new cell
> is created and the final value of the loop variable
> copied into it.
> Implementations other than CPython that aren't using
> cells may need to do something more traditional, such
> as compiling the loop body as a separate function.
You'll need to make sure that exceptions don't break this. I'm not sure
to what extent the current test suite covers the current behavior, I
think that beefing it up is a necessary precondition to trying this
Aahz (aahz at pythoncraft.com) <*> http://www.pythoncraft.com/
"...if I were on life-support, I'd rather have it run by a Gameboy than a
Windows box." --Cliff Wells, comp.lang.python, 3/13/2002
More information about the Python-ideas