代码之家  ›  专栏  ›  技术社区  ›  crazyy_photonn

无法理解python 2d矩阵的输出

  •  0
  • crazyy_photonn  · 技术社区  · 6 年前

    我尝试以螺旋格式打印值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 回复  |  直到 6 年前
        1
  •  3
  •   Thierry Lathuille    6 年前

    [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 = [[0]*n for i in range(n)]