为什么更新 python 中的一个实例 class 变量会同时更新其他不相关的变量?

Why does updating one instance class variable in python update other unrelated variable at the same time?

在我的代码中,我试图为两个玩家实例化一个简单的战舰游戏板。对于每个玩家,我正在初始化两个 5X5 的棋盘,并尝试向其中一个棋盘添加一个 "S" 来代表一艘船。我相信我只是将 "S" 添加到其中一个板上,但出于某种原因,两个板最终都更新为 "S" - 一个应该保持空白。

我不知道为什么会这样 - 谁能帮忙解释一下?

class Gameboard:
    def __init__(self,  p1_boards = [[],[]], p2_boards = [[],[]], turn = 1):
        self.p1_boards = p1_boards
        self.p2_boards = p2_boards
        self.turn = turn
        i = 0 
        x = randint(0,4)
        y = randint(0,4)

        while i < 5:
            rows = [" "," "," "," "," "]
            self.p1_boards[0].append(rows)
            self.p1_boards[1].append(rows)
            self.p2_boards[0].append(rows)
            self.p2_boards[1].append(rows)
            i += 1
        self.p1_boards[0][randint(0,4)][randint(0,4)] = SHIP
        print(self.p1_boards[0])
        print(self.p1_boards[1])


The two print statements at the end produce:

[[' ', ' ', ' ', 'S', ' '],
 [' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ']]

and 

[[' ', ' ', ' ', 'S', ' '],
 [' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' '],
 [' ', ' ', ' ', ' ', ' ']]

您将行附加到两个版块。 如果你这样做

x.append(rows)

您只需交出一份参考资料。 所以最后你会得到 p1_boards[0] 和 p1_boards1 指向同一个列表,类似于此图中的 a 和 b:

因此,当您稍后更改其中一个列表中的行或一个值时,它也会在另一个列表中更改,因为两个列表都引用同一个列表。 如果你这样做

x.appends(rows.copy())

相反,问题应该得到解决。

另见 here