То, как вы создали 2D-массив, создает мелкий список
arr = [[0]*cols]*row
Вместо этого, если вы хотите обновить элементы списка, вы должны использовать
rows, cols = (5, 5)
arr = [[0 for i in range(cols)] for j in range(rows)]
Пояснение :
Список можно создать, используя:
arr = [0]*N
или
arr = [0 for i in range(N)]
В первом случае все индексы точки массива к тому же целочисленному объекту
and when you assign a value to a particular index, a new int object is created, for eg arr[4] = 5
creates
Now let us see what happens when we create a list of list, in this case, all the elements of our top list will point to the same list
And if you update the value of any index a new int object will be created. But since all the top-level list indexes are pointing at the same list, all the rows will look the same. And you will get the feeling that updating an element is updating all the elements in that column.
Credits: Thanks to Пранав Девараконда для простого объяснения здесь