Всё так происходит из-за способа задания таблицы:
a = [[0] * n] * n
Каждый раз при a[0][0] = 1, оно как бы сначала обращается к a[0] = [[0] * n] а потом уже этом массиве, изменяет первый элемент в последовательности, и далее хоть и кажется, что получается тот массив, который мы хотим, но по итогу выходит что-то вроде... [[1, 0, 0...]] * n , и в конечном итоге, после такой отрисовки устанавливается, что каждый сделующий добавленный элемент, копирует значение первого.
Ps. Для пробы, немного изменил способ создание массива, и всё сработало хорошо
a = []
for i in range(n):
a.append([0] * n)