newbie idiom question

ivnowa at hvision.nl ivnowa at hvision.nl
Tue Jun 22 08:47:24 CEST 1999


On 21 Jun 99, Alex Rice wrote:

> Something I keep getting tripped up about is that objects being
> iterated in "for" statements cannot be modified.
> 
> I keep trying to do this:
> 
>       >>> eggs = [1,2,3]
>       >>> for spam in eggs:
>       ...	spam = 'cooked'
>       ...
>       >>> eggs
>       [1, 2, 3]
>       >>> 
> 
> The tutorial says this:
> 
>       If you need to modify the list you are iterating over, e.g., duplicate
>       selected items, you must iterate over a copy. The slice notation makes
>       this particularly convenient:

> Understood, but what if you want to modify each element in a list?
> What's the best way to do this in terms of speed and elegance? I guess
> I just haven't seen a good example of this yet in Python

> What I'm unfortunately used to is this, in Perl:
> 
>       @eggs = (1,2,3);
>       foreach $spam (@eggs) {
> 	$spam = 'cooked'; 
>       }
>       print "@eggs";
>       >>> cooked cooked cooked

An unwelcome side effect, methinx. You can use range:

for i in range(len(eggs)):
    eggs[i] = 'cooked'

Since the list you're iterating over is the same as the list you're 
modifying, it may be wise to use a slice (not in this particular 
case, but in general):

for i in range(len(mylist[:])):
    if mylist[i] == 'ham':
        mylist[i:i] = ['eggs']  # insert something

You can also use map:

eggs = map(lambda s: 'cooked', eggs)

But this can get difficult for complex lambdas, and it doesn't change 
the list in place.


Hans Nowak (ivnowa at hvision.nl)
Homepage: http://fly.to/zephyrfalcon




More information about the Python-list mailing list