我无法理解为什么我的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]]
答案 0 :(得分:2)
问题是,您在节点中的integer
变量内的current
中保存了对数组的引用。这样,当您调用board
时,此数组将被更改。相反,您可能希望每个节点都有一个新的数组副本,您可以使用swap
。
答案 1 :(得分:0)
将指向列表的变量分配给另一个变量并不意味着复制列表。
new = Node(current)
创建Node
类型的对象,其self.board
指向与current
相同的列表,因此每当您修改new
时,{{1} }也被修改了。
要避免这种情况,请使用以下命令:
current