[Python-ideas] For-loop variable scope: simultaneous possession and ingestion of cake

Greg Ewing greg.ewing at canterbury.ac.nz
Thu Oct 9 01:30:11 CEST 2008


Jim Jewett wrote:

> How do you figure?  As nearly as I can tell, the only difference is
> that let* is evaluated in order (left-to-right) instead of in
> parallel.

That's not quite right.

The difference between let and let* is that each expression
in a let* is evaluated in a scope that includes the names
bound by the previous expressions. In other words, it's
equivalent to a nested sequence of let statements.

>     >>> def g(a=f(), b=h()): print b
> 
>     var is from f
> 
> This shows that the side effect of binding a was already present when
> b was bound.

It's not about side effects, it's about name visibility.

If the binding of function arguments worked like let*,
then you would be able to refer to the name a in the
expression being assigned to b, i.e. this would be legal:

   def g(a = f(), b = h(a)):
     ...

But it's not -- you would get a NameError on a if you
tried that. In that respect it's like let, not let*.

-- 
Greg



More information about the Python-ideas mailing list