# no side effects

holger krekel pyth at devel.trillke.net
Wed Jan 8 18:32:20 CET 2003

```"Martin v. L?wis" wrote:
> holger krekel wrote:
> > Depends on your background.  *If* somebody e.g. thinks that
> >
> >     for i in range(3):
> >         print i
> >         i = 3
> >
> > is somewhat equivalent to C's
> >
> >     int i;
> >     for (i=0 ; i<3 ; i++) {
> >         printf("%d\n", i);
> >         i = 3;
> >     }
> >
> > then IMHO my explanation serves well and talking about underlying
> > iterator protocols wouldn't help too much.
>
> Difficult to say, since you have to come up with a theory of why people
> think so.

Actually i wanted to study psychology but did computer science instead :-)

Of course, there are all kinds of analogies for all kinds of constructs.
I happened to guess that the OP was thinking along the above lines.
And I didn't mean to say that the above "equivalence" is canonical
or natural in any way.

> People might expect that the Python for loop translates to
> something like
>
> seq = [1,2,3]
> i = seq[0]
> while 1:
>    SUITE
>    try:
>      i = seq[seq.find(i)+1]
>    except IndexError:
>      break
>
> Of course, they would never spell it out that way: they might think "At
> the end of the loop, look at the current value of i, then take the
> element from the sequence that follows i". This is roughly how the C
> loop works, and translates into the Python fragment above.
> [further explanation]

ok.

> > Why is the way the python for-loop gets to the next *value*
> > more important than understanding that python works with
> > name-object bindings everywhere?  And what is so wrong
>
> I would expect that Michelle has grasped the notion of namespaces and
> name bindings by now; the question hinted at a misunderstanding of the
> for loop semantics.

Maybe, who knows?

pythons "name binding" often confuse newcomers, too.
So i choose to explain both the loop and name-binding
concept.  In my first response i wrote

for i in [1,2,3]:
print i
i=3

the for-loop will iteratively bind the (local) name to
1, then 2, then 3.  It never looks at the binding of
the name 'i'.  With 'i=3' you only change the binding
of 'i' to the object '3' but the for-loop will blindly
change the binding again.

How does this give any wrong impression about the for-loop
in question?

In my experience, explanations are often better if they also
transport appropriate nomen clatura.  In order to say what
the for-loop actually does to 'i'  it occurs to me that
name-binding plays a central role.

Explaining the details of the actual iteration over the list
didn't seem as central to me.

> This details of the for loop is hardly ever noticed,
> but I'm sure it has confused more than one newcomer (I remember having
> been confused by it myself).

i agree. The loop and iteration details deserve attention.

regards,

holger

```