3.7.4. Modifying a list while looping#

In section Looping using for, we learned how to loop through every element of a list:

the_list = [10, 20, 30, 40]

for element in the_list:
    print(element)
10
20
30
40

Let’s try if looping through the list element allows us to not only read the list, but also modify it. In this example, we want to multiply every element of a by 100:

the_list = [10, 20, 30, 40]

print(f"Before: {the_list}")

for element in the_list:
    element = element * 100

print(f"After: {the_list}")
Before: [10, 20, 30, 40]
After: [10, 20, 30, 40]

Well, it didn’t work, but why? Although it is not intuitive, the line element = element * 100 of this code means:

“Calculate element times 100, and put the result in a new variable that we’ll call element”.

In other words, at each iteration, the name element is overwritten and does not refer to the list anymore. Therefore, the list is not modified.

Instead of looping trough the list elements, we could loop through the list indexes instead, using a range from 0 to the end of the list:

the_list = [10, 20, 30, 40]

print(f"Before: {the_list}")

for i in range(len(the_list)):
    the_list[i] = the_list[i] * 100

print(f"After: {the_list}")
Before: [10, 20, 30, 40]
After: [1000, 2000, 3000, 4000]

It worked because at every iteration, we explicitely write to the ith element of the_list.