为什么更新 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
在我的代码中,我试图为两个玩家实例化一个简单的战舰游戏板。对于每个玩家,我正在初始化两个 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