[Python-Dev] 2.5 and beyond

Greg Ewing greg.ewing at canterbury.ac.nz
Mon Jul 3 03:50:54 CEST 2006


Tim Peters wrote:

> Scheme has no loops in Python's sense --
> things like "do" are shorthand for expressing stylized recursion

But it does have foreach and map, which are the
moral equivalent of Python's for-loops and list
comprehensions. The body is a lambda which takes
the loop variable as a parameter, thus providing
the extra level of scope. Recursion isn't needed.

> When people talk about giving a Python for-loop vrbl its own scope,
> they generally don't mean a new scope on _each iteration_,

But that's exactly what you *do* need in order for
a for-loop with a lambda in it to behave intuitively.
If that's not what people mean, it's because they
don't fully understand what they really mean to
mean. :-)

BTW, I'm not suggesting that a new stack frame
gets allocated for every iteration -- all you need
is a cell.

> about the same as creating a nested block with
> its own autos in C.

Analogies with C aren't very helpful here, because
it doesn't have closures, so it's only a matter of
visibility, not lifetime.

 > creating a new scope on each iteration
 > sounds hard to explain in Python.

But is it harder to explain than the reason someone's
loop-with-a-lambda doesn't do what they expect?

BTW, I wouldn't explain it by saying it creates a new
scope, I'd say it creates a new binding on each
iteration, or something like that.

In my earlier proposal, you would actually say that
explicitly, with something like

   for new i in range(10):
     ...

> Abusing the default-argument machinery to capture current bindings is
> never necessary, and _is_ abuse.

But it's abuse that still happens, because although
scoping has been fixed, other parts of the story are
still missing.

--
Greg


More information about the Python-Dev mailing list