сложение матрицы дает неправильный ответ - PullRequest
0 голосов
/ 18 января 2020

Я из java фона, я учусь python матричной операции. У меня есть вопрос о назначении, чтобы добавить две матрицы вручную. Я не могу определить ошибку в моем логе c. нужна помощь спасибо

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] * col] * row
for i in range(len(x)):
    for j in range(len(x[i])):
            ans[i][j] = x[i][j] + y[i][j]
print()
print(ans)

вывод: [[11, 13, 18], [11, 13, 18], [11, 13, 18]]

1 Ответ

1 голос
/ 18 января 2020

Проблема здесь:

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)
...