одинаковые матрицы одним и тем же кодом обрабатываются по разному
M = int(input()) #количество узлов
N = int(input()) #количество каналов
matrix1 = [[0,0,0],[0,0,0],[0,0,0]]
matrix2 = []
c = []
for i in range(M):
c.append(0)
for i in range(M):
matrix2.append(c)
print(matrix1)
print(matrix2)
for i in range(N):
abc = input().split()
a = int(abc[0])-1
b = int(abc[1])-1
c = int(abc[2])
matrix1[a][b] = 6
print(a)
print(b)
print(matrix1[a][b])
print(matrix1)
Две матрицы: matrix1 и matrix2. Они идентичны, только первая введена вручную а вторая автоматически. Я знаю что есть numpy, но мне надо знать, почему они именно в этом примере после обработки дают разный результат?
Ответы (1 шт):
Причина в том, что при matrix2.append(c), где c является списком (изменяемым объектом), не будет копирования, а будет добавление ссылки на список.
Это приведет к тому, что в matrix2[0], matrix2[1], ..., matrix2[n] будет находиться один и тот же объект, поэтому изменения будут видны во всем массиве, хотя поменяли, например, только в одной строке.
Поэтому, вам нужно, или создавать копии c при добавлении или создавать новый список.
Вариант с копией.
Можно обернуть c в функцию создания списка, тогда будет сделана копия
for i in range(M):
matrix2.append(list(c))
Но если у вас в c будут другие изменяемые объекты (например списки), то это не скопирует их.
Для полной копии нужно можно использовать функцию из модуля copy.deepcopy
Вариант создания нового списка.
Можно использовать генератор списка:
for i in range(M):
matrix2.append([0 for _ in range(M)])