我有以下代码:
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 语句中,但我不明白他们为什么会这样。如果我发帖有任何错误,我深表歉意,这是我第一次发帖。提前致谢。
答案 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)]