作为参数传入的函数覆盖列表 - Python

Function overwriting list passed in as argument - Python

我正在编写一个程序来玩井字游戏(我正在学习 python)。我有一个函数,它获取一个名为 movelist 的 10 项列表,然后检查是否有任何玩家,Xs 或 Os 赢得了比赛。如果其中之一有,则 returns 'X' 或 'O',如果没有人赢得它 returns 错误。 wins 是所有可能获胜组合的列表。但是该函数正在覆盖移动列表,我不明白为什么。我将 movelist 分配给测试,然后遍历并更改测试,所以我不明白 where/why 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

我认为您遇到的问题是您应该使用 test = movelist.copy() 而不是 test = movelist。这是 python 中的一个常见问题,也是 python 中列表功能的一部分。 3. 字典也会出现同样的问题,它也有 .copy() 方法。希望对您有所帮助。