首页 > 解决方案 > 尝试实现 zobrist 哈希,但 python 正在更改我的 zTable 中的值,原因是

问题描述

因此,我正在尝试将 zobrist 散列实施到我正在从事的学校项目中。但是,在初始化随机数表时,打印 zTable 的输出具有相同的条目(126 和 127 是最后创建的数字)。我知道对于 zobrist 散列,我应该使用大的 64 位数字来表示每个部分及其位置。但是在我的游戏中,只有两个棋子,所以我的想法是只要数字是唯一的,应该没关系。

经过几轮调试后,我发现在程序循环中分配了正确的数字,但是一旦程序退出,当我调用 print(zTable) 时,数字就不同了。有什么建议吗?谢谢

zTable = [[[None] * 2] * 8] * 8
currNumber = 0


# Initializes the zHashTable for this board
def initTable(self):
    for row in range(8):
        for col in range(8):
            for i in range(2):
                self.zTable[row][col][i] = self.currNumber
                self.currNumber += 1

标签: pythonarraysmultidimensional-array

解决方案


以下代码应该可以工作。请注意,每个子列表的 ID 都不同

# Initializes the zHashTable for this board
def initTable():
    zTable = [[[None] * 2 for _ in range(8)] for _ in range(8)]
    currNumber = 0

    for row in range(8):
        for col in range(8):
            for i in range(2):
                zTable[row][col][i] = currNumber
                currNumber += 1

    for subList in zTable:
        print(id(subList))

    print(zTable)


initTable();

输出

140453289927112
140453289930376
140453289934920
140453289935560
140453289936200
140453289936840
140453289937544
140453289938184
[[[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11], [12, 13], [14, 15]], [[16, 17], [18, 19], [20, 21], [22, 23], [24, 25], [26, 27], [28, 29], [30, 31]], [[32, 33], [34, 35], [36, 37], [38, 39], [40, 41], [42, 43], [44, 45], [46, 47]], [[48, 49], [50, 51], [52, 53], [54, 55], [56, 57], [58, 59], [60, 61], [62, 63]], [[64, 65], [66, 67], [68, 69], [70, 71], [72, 73], [74, 75], [76, 77], [78, 79]], [[80, 81], [82, 83], [84, 85], [86, 87], [88, 89], [90, 91], [92, 93], [94, 95]], [[96, 97], [98, 99], [100, 101], [102, 103], [104, 105], [106, 107], [108, 109], [110, 111]], [[112, 113], [114, 115], [116, 117], [118, 119], [120, 121], [122, 123], [124, 125], [126, 127]]]

在您的代码中(稍微简化了一点),请注意每个子列表的 ID 相同

# Initializes the zHashTable for this board
def initTable():
    zTable = [[[None] * 2] * 8] * 8
    currNumber = 0

    for row in range(8):
        for col in range(8):
            for i in range(2):
                zTable[row][col][i] = currNumber
                currNumber += 1

    for subList in zTable:
        print(id(subList))

    print(zTable)


initTable();

输出

140702461087048
140702461087048
140702461087048
140702461087048
140702461087048
140702461087048
140702461087048
140702461087048
[[[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]], [[126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127], [126, 127]]]

使用zTable = [[[None] * 2] * 8] * 8,您在每个副本中引用相同的列表。

zTable = [[[None] * 2 for _ in range(8)] for _ in range(8)], 每次都会创建深层副本。


推荐阅读