no side effects

andy andy at eastonwest.co.uk
Fri Jan 10 17:02:18 EST 2003


On Wednesday 08 Jan 2003 6:37 pm, Cliff Wells wrote:
> On Wed, 2003-01-08 at 05:10, Michele Simionato wrote:
> > I was surprised by the following code:
> > >>> for i in [1,2,3]:
> >
> > ...     print i,
> > ...     i=3
> >
> > I would have expected only 1 to be printed, but instead Python
> > continues the loop without noticing that the value of i has
> > changed. IOW, no side effect.
>
> You've gotten a lot of detailed responses, but maybe this will make it
> clearer:
>
> _l = [1,2,3]
> for _i in range(len(_l)):
>     i = _l[_i]
>     print i,
>     i = 3
>
>
> In this case you obviously wouldn't expect assigning 3 to i to change
> the loop, yet this is similar to what is happening in the case you
> presented, except that _i is created implicitly by the interpreter and
> is hidden from normal Python programs.
>
> Regards,

Has to be noted, also, that many other languages would exhibit either the same 
behaviour or even random effects, due to loop optimizations, such as keeping 
the loop variable in a machine register, or even unfolding the loop.  But in 
any case, most languages' /for/ loop iterates over a sequence of ordinals, 
not a list...

isn't it more like this?

p=0 # internal loop counter
lst=[1,2,3] # the list to enumerate
while p<len(lst): # control loop
    i=lst[p] # get the current list item
    print i
    i=3
    p+=1 # increment loop control counter

Or am I missing the point completely?

-andyj





More information about the Python-list mailing list