变量被重置

时间:2017-01-07 19:35:43

标签: python python-2.7

下面的类采用一个列表,然后使用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()

1 个答案:

答案 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]