Если запустить такой скрипт:
mx = 5
my = 5
m = [([0] * mx)] * my
for x in range(mx):
for y in range(my):
m[x][y] = ((x%2 == 0)and(y%2==0))
for l in m:
print(l)
Вместо ожидаемого (False в нечётных строках или колонках):
[True, False, True, False, True]
[False, False, False, False, False]
[True, False, True, False, True]
[False, False, False, False, False]
[True, False, True, False, True]
получается (False только в нечётных колонках):
[True, False, True, False, True]
[True, False, True, False, True]
[True, False, True, False, True]
[True, False, True, False, True]
[True, False, True, False, True]
Почему так происходит?
Ответ: Применение * к списку умножает не список, а ссылку на список. Реально в m — 5 ссылок на одну строку.