我无法理解为什么我的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]]
问题是,在节点中的
board
变量内保存对current
中数组的引用。这样,当您调用swap
时,这个数组就改变了。相反,您可能希望在每个节点中都有一个新的数组副本,您可以使用copy.deepcopy(node)
来实现这一点。你知道吗将指向列表的变量赋给另一个变量并不意味着复制列表。你知道吗
new = Node(current)
创建一个类型为Node
的对象,其self.board
指向与current
相同的列表,因此每当您修改new
时,current
也会被修改。你知道吗要避免这种情况,请使用以下方法:
相关问题 更多 >
编程相关推荐