Проблема здесь:
ans = [[0]*col]*row
Этот оператор создает row
количество объектов, где каждый объект равен [[0]*col]
. Это означает, что каждый «подсписок» в списке указывает на один и тот же список.
(Подробнее об этом поведении здесь: Список изменений списков, неожиданно отраженных в подсписках )
Это можно проверить, проверив id
значения ans[0]
, ans[1]
и так далее:
>>> a = [[0]*col]*row
>>>
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> id(a[0])
140336190913992
>>> id(a[1])
140336190913992
>>> id(a[2])
140336190913992
Это означает, что если мы установим a[0][1] = 10
(скажем), то в КАЖДОМ подсписке будет установлено значение 10
. Это потому, что все списки указывают на один и тот же список.
т.е.
>>> a[0][1] = 10
>>> a
[[0, 10, 0], [0, 10, 0], [0, 10, 0]]
Теперь, как нам этого избежать? Это можно сделать, инициализировав список ans
другим способом, например:
b = [[0 for x in range(col)] for y in range(row)]
Вы можете проверить, что все подсписки указывают на разные адреса, снова используя id
:
>>> id(b[0])
140336190512520
>>> id(b[1])
140336190765000
>>> id(b[2])
140336197031816
Так что теперь, если вы запустите исходную программу, вы получите желаемые результаты.
TLDR; Ваша измененная программа выглядит следующим образом:
x = [[12,7,3],[4 ,5,6],[7 ,8,9]]
y = [[5,8,1],[6,7,3],[4,5,9]]
row = len(x)
col = len(x[0])
ans = [[0 for x in range(col)] for y in range(row)]
for i in range(len(x)):
for j in range(len(x[i])):
ans[i][j] = x[i][j] + y[i][j]
print(ans)