Python Stack Corruption?

时间:2011-12-25 00:25:36

标签: python

我对python相对较新(但不是编程),我无法解释以下行为。似乎一个对象(“child”)中的变量(我的示例中的列表“children”)被一个完全不同的对象(“node”)中的该变量的值覆盖。为了给出一些上下文,我试图创建一个在树结构中使用的简单Node类。该节点具有子节点和父节点(所有其他节点)。

我无法弄清楚为什么child.children获得与node.children相同的值。他们以某种方式引用相同的数据吗?为什么?代码和输出如下:

class Node:
    children = []
    parent = 0
    visited = 0
    cost = 0
    position = (0, 0)
    leaf = 0

    def __init__(self, parent, pos):
        self.parent = parent
        self.position = pos

    def addChild(self, node):
        self.children += [node]

node = Node(0, (0,0))
child = Node(node, (3,2))

node.addChild(child)

print "node: ",
print node

print "node.childen: ",
print node.children

print "child: ",
print child

print "child.children",
print child.children

输出:

node:  <__main__.Node instance at 0x414b20>
node.childen:  [<__main__.Node instance at 0x414b48>]
child:  <__main__.Node instance at 0x414b48>
child.children [<__main__.Node instance at 0x414b48>]

如您所见,node.children和child.children都具有相同的值(包含child的列表),即使我只更新了node.children。谢谢你的帮助!

2 个答案:

答案 0 :(得分:6)

children变量被声明为类级变量,因此它在Node的所有实例之间共享。您需要通过在初始化程序中设置它来声明它为实例变量。

class Node:
    #children = [] # not here...
    parent = 0     # might want to rethink where you initialize these
    visited = 0
    cost = 0
    position = (0, 0)
    leaf = 0

    def __init__(self, parent, pos):
        self.parent = parent
        self.position = pos
        self.children = [] # ...but here

    def addChild(self, node):
        self.children += [node]

答案 1 :(得分:2)

你已经让'children'成为了一个class属性,这意味着它在该类的所有对象之间共享。

相反,请在类的 init 方法中初始化它。

def __init__(self):
    self.children = []
    ...