Python每次迭代都打印不同的值,但值不变。

2024-04-26 11:21:49 发布

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

我无法理解为什么我的python代码以某种方式运行。你知道吗

因为我不改变“当前”的输出应该是相同的每次迭代?这是一个问题,因为我需要“current”是相同的,所以每个节点都是从相同的起始值生成的。你知道吗

请参见以下代码:

你知道吗测试仪.py你知道吗

class Node:
    def __init__(self, board=None):
        self.board = board

    def getBoard(self):
        return self.board

    def swap(self, xPos, yPos): # swap with zero

        for a in self.board:
            if 0 in a:
                self.board[self.board.index(a)][a.index(0)] = self.board[xPos][yPos]

        self.board[xPos][yPos] = 0

open = []

def gen_nodes(current):

    for i in [7, 15, 11]:

        print(current) # <-- why does this print a different value each time?

        new = Node(current)

        for a in new.getBoard():
            if i in a:
                xPos = new.getBoard().index(a)
                yPos = a.index(i)

        new.swap(xPos, yPos)

        open.append(new)

if __name__ == '__main__':
    gen_nodes([[1,   2,  3,  4],
               [8,   5,  6,  7],
               [9,   10, 11, 0],
               [12, 13, 14, 15]])

输出:

[[1, 2, 3, 4], [8, 5, 6, 7], [9, 10, 11, 0], [12, 13, 14, 15]]
[[1, 2, 3, 4], [8, 5, 6, 0], [9, 10, 11, 7], [12, 13, 14, 15]]
[[1, 2, 3, 4], [8, 5, 6, 15], [9, 10, 11, 7], [12, 13, 14, 0]]

Tags: 代码inselfboardnodenewforindex
2条回答

问题是,在节点中的board变量内保存对current中数组的引用。这样,当您调用swap时,这个数组就改变了。相反,您可能希望在每个节点中都有一个新的数组副本,您可以使用copy.deepcopy(node)来实现这一点。你知道吗

将指向列表的变量赋给另一个变量并不意味着复制列表。你知道吗

new = Node(current)创建一个类型为Node的对象,其self.board指向与current相同的列表,因此每当您修改new时,current也会被修改。你知道吗

要避免这种情况,请使用以下方法:

from copy import copy

new = Node(copy(current))

相关问题 更多 >