Почему это происходит? Два метода, которые должны дать один и тот же результат, но это не так:
a_good=[[0,0],[0,0]]
for i in [0,1]:
for j in [0,1]:
a_good[i][j]=str(i)+str(j) #[['00','01'],['10','11']]
a_error=[[0]*2]*2
for i in [0,1]:
for j in [0,1]:
a_error[i][j]=str(i)+str(j) #[['10','11'],['10','11']] !?
Во втором, a_error [0] и a_error [1] являются ссылками на один и тот же список. Поэтому, когда вы обновляете значения, хранящиеся в a_error [0], вы обновляете значения, хранящиеся в a_error [1]
a_error=[[0]*2]*2
for i in [0,1]:
print(a_error)
for j in [0,1]:
a_error[i][j]=str(i)+str(j) #[['10','11'],['10','11']]
print(a_error)
# [[0, 0], [0, 0]]
# [['00', '01'], ['00', '01']] # before i=1
# [['10', '11'], ['10', '11']] # after i=1