打印嵌套循环的结果非常奇怪

时间:2021-05-09 07:05:57

标签: python loops

我有以下代码:

def printBoard(bd, userX, userY):
    board = [[0]*(col+2)]*(row+2)
    for i in range(col + 2):
        for j in range(row + 2):
            print(i, " ", j)
            if((i==0 and j==0) or (i==0 and j==row) or (i==col and j==0) or (i==col and j==row)):
                board[i][j] = "+"
            elif(i==0 or i==col):
                board[i][j] = "-"
            elif(j==0 or j==row):
                board[i][j] = "|"
            else:
                board[i][j] = getBoard(j-1, i-1, bd, userX, userY)

    print('\n'.join(map(''.join, board)))

我正在寻找这个结果:

+----------+
|..........|
|..........|
|..........|
|........10|
|........1*|
+----------+

但我总是得到这个:

+----------+
+----------+
+----------+
+----------+
+----------+
+----------+
+----------+
+----------+
+----------+
+----------+
+----------+

我知道最后一行工作正常,我以前用过。我认为问题出在 if 语句中,但我不明白他们为什么会这样。如果我发帖有任何错误,我深表歉意,这是我第一次发帖。提前致谢。

1 个答案:

答案 0 :(得分:2)

当您编写 [[0]*(col+2)]*(row+2) 时,您会得到一个包含同一列表的 row+2 实例的列表。因为它们是同一个列表的实例,修改一个会导致它们都被修改。所以你的输出是板子的最后一行,因为那些是最后的修改。

查看此成绩单:

>>> row, col = 10, 5
>>> board = [[0]*(col+2)]*(row+2)
>>> board[1][1] = 42
>>> board
[[0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0], [0, 42, 0, 0, 0, 0, 0]]

请注意,即使仅更新了 board[1][1],元素 1 在每一行上都发生了变化。

正确的写法是:

board = [([0] * (col+2)) for _ in range(row+2)]

或者等效但更一致:

board = [[0 for _ in range(col+2)] for _ in range(row+2)]