【发布时间】:2020-09-04 06:02:27
【问题描述】:
我正在编写一个程序来玩井字游戏(我正在学习 python)。我有一个函数,它传入一个名为 movelist 的 10 项列表,然后检查是否有任何玩家,无论是 Xs 还是 Os 赢得了比赛。如果其中一个获胜,则返回“X”或“O”,如果没有人获胜,则返回 False。 wins 是所有可能获胜组合的列表。但是该函数正在覆盖移动列表,我不知道为什么。我将 movelist 分配给测试,然后迭代并更改测试,所以我不明白 movelist 在哪里/为什么被更改。传入的典型移动列表是 ['#','X','X','X',4,'O',6,7,'O',9]。该函数根本不应该更改列表“movelist”,因为它会覆盖之前已经做出的动作并使游戏无法玩。 请看下面的代码:
def gamewon(movelist):
#WINNING COMBINATIONS
wins = [['N','Y','Y','Y','N','N','N','N','N','N'],['N','N','N','N','Y','Y','Y','N','N','N'],
['N','N','N','N','N','N','N','Y','Y','Y'],['N','Y','N','N','Y','N','N','Y','N','N'],
['N','N','Y','N','N','Y','N','N','Y','N'],['N','N','N','Y','N','N','Y','N','N','Y'],
['N','Y','N','N','N','Y','N','N','N','Y'],['N','N','N','Y','N','Y','N','Y','N','N']]
test = movelist
index = 0
for item in test:
if item == 'X':
test[index] = 'Y'
index += 1
else:
test[index] = 'N'
index += 1
if test in wins:
return 'X'
test = movelist
index = 0
for item in test:
if item == 'O':
test[index] = 'Y'
index += 1
else:
test[index] = 'N'
index += 1
if test in wins:
return 'O'
return False
【问题讨论】:
-
见nedbatchelder.com/text/names.html。
test = movelist不复制test。它只是使test成为对同一列表的第二次引用,因此您正在修改原始列表。