Python每次迭代都会打印不同的值,但值不会更改。

时间:2016-11-20 18:21:17

标签: python

我无法理解为什么我的python代码以某种方式起作用。

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

请参阅以下代码:

tester.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]]

2 个答案:

答案 0 :(得分:2)

问题是,您在节点中的integer变量内的current中保存了对数组的引用。这样,当您调用board时,此数组将被更改。相反,您可能希望每个节点都有一个新的数组副本,您可以使用swap

答案 1 :(得分:0)

将指向列表的变量分配给另一个变量并不意味着复制列表。

new = Node(current)创建Node类型的对象,其self.board指向与current相同的列表,因此每当您修改new时,{{1} }也被修改了。

要避免这种情况,请使用以下命令:

current