奇怪的Python类行为

时间:2013-08-03 01:22:45

标签: python algorithm tree

我创建了一个简单的类来管理相关对象的树:

class node(object):
    children = list([])

    def __init__(self, ID, *children):
        self.ID = ID
        for c in children:
            self.children.append(c)

    def add(self, *children ):
        for c in children:
            self.children.append(c)

    def __str__(self):
        return self.ID
    def __repr__(self):
        print self.ID, len(self.children)


root = node('1')
root.add( node('1.1', node('1.1.1')),
          node('1.2'))

for c in root.children:
    print c

我得到了:

1.1.1
1.1
1.2

但是我期待的只有1.1和1.2。我的错是什么?

感谢, 梅德

2 个答案:

答案 0 :(得分:3)

self.children指的是node.children,它是一个类变量。列表的所有实例之间只共享一个列表实例。

您需要将其设为实例变量:

class Node(object):
    def __init__(self, id, *children):
        self.children = []

此外,__str__ and __repr__应返回遵循特定格式的字符串。

答案 1 :(得分:1)

children = list([])放在__init__方法中,如下所示:

def __init__(self, ID, *children):
        self.ID = ID
        self.children = []
        for c in children:
            self.children.append(c)