下面的类采用一个列表,然后使用move_pieces方法,切换最后两个项的顺序并返回一个新列表。不知何故,当我运行下面的代码时,该方法不会返回一个新列表,而是保存self.state和我创建的'test'列表来运行代码。有什么想法吗?
class node:
def __init__(self, state):
self.state = state
def move_piece(self):
new_node = self.state
new_node[7] , new_node[8] = new_node[8] , new_node[7]
return new_node
test = [1,3,4,8,6,2,7,0,5]
test_node = node(test)
test_node.move_piece()
答案 0 :(得分:1)
感谢您提高质量。你的问题更清楚了,我已经对它进行了反思,以反映这一点。
...而不是复制实例状态并返回最后两个项目切换,程序切换项目并保存在self.state属性上。有什么想法吗?
这是因为行new_node = self.state
,它基本上声明了对内存中同一个数组的第二个引用self.state
。使用new_node
进行的任何更改都将更改self.state
指向的数组。
要更改此设置,您可以将new_node = self.state
替换为new_node = self.state[:]
来创建列表副本:
class node:
def __init__(self, state):
self.state = state
def move_piece(self):
new_node = self.state[:]
new_node[7] , new_node[8] = new_node[8] , new_node[7]
return new_node
test = [1,3,4,8,6,2,7,0,5]
test_node = node(test)
test_out = test_node.move_piece()
print('test:\t\t\t\t{}'.format(test))
print('test_node.state:\t{}'.format(test_node.state))
print('test_out:\t\t\t{}'.format(test_out))
<强>输出强>
test: [1, 3, 4, 8, 6, 2, 7, 0, 5]
test_node.state: [1, 3, 4, 8, 6, 2, 7, 0, 5]
test_out: [1, 3, 4, 8, 6, 2, 7, 5, 0]