尝试实现zobrist散列,但python出于某种原因正在更改zTable中的值

2024-07-04 17:00:13 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在努力将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

Tags: 项目inself程序游戏for条目range
1条回答
网友
1楼 · 发布于 2024-07-04 17:00:13

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

^{1}$

输出

^{pr2}$

在您的代码中(稍微简化了一点),注意每个子列表的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)],则每次都创建深拷贝。在

相关问题 更多 >

    热门问题