одинаковые матрицы одним и тем же кодом обрабатываются по разному

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 шт):

Автор решения: gil9red

Причина в том, что при 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)])
→ Ссылка