Confused about nested for loops in Python

Viewed 30

I have a very simple question about nested for loops in Python (perhaps applicable to other languages).

Here's a minimal example:

my_array = [[0]*10]*10
k = 0
for i in range(10):
    for j in range(10):
        my_array[i][j] = k
        k += 1 

After executing these lines, I would expect my_array to look like a matrix with the digits 0 through 99 written out left to right top to bottom.

Instead my_array looks like this:

[[90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]

Somehow it seems k is only being evaluated according to its values on the last run of the outermost i loop.

Does anyone understand what Python is doing here? Using the product function from ittertools produces (as the documentation makes clear) the same result. Also, replacing range(10) with either a tuple or a list of the digits 0 through 9 produces the same result.

0 Answers
Related