Python init默认值创建类的链接实例

时间:2016-02-03 04:31:00

标签: python list python-3.x graph init

此代码旨在创建图表实现。但是,所有节点“self.children”都链接到内存中的相同列表,因此将子节点添加到其中任何节点都会将其添加到所有节点。我不能为我的生活想想为什么会这样,我已经多次上过这样的课,而且没有这样的问题。

我的意思是,仅仅因为你在默认值中定义一个列表并不意味着我在那里制作一个列表,是吗?这令人困惑......

class DescisionNode(object):
    def __init__(self,data,score,childs=[]):
        self.data = data
        self.score = score
        self.parent = None
        self.children = childs
    def getTop(self):
        if self.parent == None:
            return self
        else:
            return self.parent.getTop()
    def getEnds(self):
        out = []
        if len(self.children)==0:
            return [self]
        else:
            print(self,self.children)
            for n in self.children:
                out += n.getEnds()
            return out
    def add(self, newNode):
        if newNode.parent == None:
            newNode.parent = self
        else:
            raise Exception("Parent already exists.")
        if newNode is self:
            raise Exception("self may not be child")
        self.children.append(newNode)

1 个答案:

答案 0 :(得分:-1)

这是由于:http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments

  

Python的默认参数在定义函数时被计算一次,而不是每次调用函数时(比如Ruby)。这意味着如果你使用一个可变的默认参数并对其进行变异,那么你将会对该对象进行变异,以便将来调用该函数。

你可以在这里找到一些讨论: "Least Astonishment" and the Mutable Default Argument

  

它只是因为Python中的函数是一流的对象,而不仅仅是一段代码。   一旦你以这种方式思考,那么它就完全有意义了:一个函数是一个被定义的对象;默认参数是"成员数据"因此他们的国家可能会从一个电话改变到另一个电话 - 正如在任何其他对象中一样