Не могу понять вывод 2D-матрицы Python - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь напечатать значения от 1 до 9 в спиральном формате, что-то вроде этого:

[1,2,3]
[8,9,4]
[7,6,5]

Однако, когда я пытаюсь напечатать его через скрипт Python (написано ниже), он перезаписываетсяЭто.Я получаю правильные индексы и значения.Я просто не могу присвоить значения правильным индексам.Сценарий:

n = 3
res = [[0]*n]*n

    count = 1

    def getcoord(r1,c1,r2,c2):
        for c in range(c1, c2+1):
            yield r1, c
        for r in range(r1+1, r2+1):
            yield r,c2
        if r1 < r2 and c1 < c2:
            for c in range(c2-1, c1-1, -1):
                yield r2,c
            for r in range(r2-1, r1, -1):
                yield r, c1


    r1 = 0
    r2 = n-1
    c1= 0
    c2 = n-1
    val = 1
    while r1<=r2 and c1<=c2:
        for r,c in getcoord(r1,c1,r2,c2):
            print(r,c)
            print("val", val)
            res[r][c] = val
            print("res", res)
            val += 1
        r1 += 1; r2 -= 1
        c1 += 1; c2 -= 1
    return res

Когда я пытаюсь отладить, я получаю следующий вывод:

(0, 0)
('val', 1)
('res', [[1, 0, 0], [1, 0, 0], [1, 0, 0]])
(0, 1)
('val', 2)
('res', [[1, 2, 0], [1, 2, 0], [1, 2, 0]])
(0, 2)
('val', 3)
('res', [[1, 2, 3], [1, 2, 3], [1, 2, 3]])
(1, 2)
('val', 4)
('res', [[1, 2, 4], [1, 2, 4], [1, 2, 4]])
(2, 2)
('val', 5)
('res', [[1, 2, 5], [1, 2, 5], [1, 2, 5]])
(2, 1)
('val', 6)
('res', [[1, 6, 5], [1, 6, 5], [1, 6, 5]])
(2, 0)
('val', 7)
('res', [[7, 6, 5], [7, 6, 5], [7, 6, 5]])
(1, 0)
('val', 8)
('res', [[8, 6, 5], [8, 6, 5], [8, 6, 5]])
(1, 1)
('val', 9)
('res', [[8, 9, 5], [8, 9, 5], [8, 9, 5]])

Чего мне здесь не хватает?Почему я не могу присвоить правильное значение правильному индексу, несмотря на то, что они оба?Заранее спасибо!

1 Ответ

0 голосов
/ 25 мая 2018

[0]*n создает список, содержащий 3 ноля: [0, 0, 0].

Затем res = [[0]*n]*n создает список, который вы называете res, который содержит в три раза больше того же список, который мы только что создали.

Итак, независимо от того, ссылаетесь ли вы на него по имени res[0], res[1] или res[2], вы всегда получаете доступ к одному и тому же уникальному списку.

Выполнение res[0][0] = 1 обновляет первый элемент этого списка, res[2][0] = 7 обновляет тот же элемент снова.

При печати res вы получаете три раза этот же список.

То, что вы хотитеэто три разных списка.Вы можете создать их так:

res = [[0]*n for i in range(n)]
...