Python:通过树生长中的构造函数调用的子引用赋值

时间:2013-01-20 11:03:58

标签: python reference constructor tree init

这是一个相当具体的问题,但由于我无法弄清楚这里发生了什么,让我告诉你这个问题:

越来越多的决策树,我有一个拆分节点的分裂函数,即它将两个子节点连接到一个节点。出于某种原因,下面的代码将节点本身分配为子节点,使得id(currentNode.children [0])== id(currentNode):

def split(currentNode):
    if impure(currentNode.data):
        currentNode.attribute = getBestAttr(currentNode.attributes,currentNode.data);
        childrenAttributes = deepcopy(currentNode.attributes);
        childrenAttributes.remove(currentNode.attribute);
        childrenData = splitData(currentNode.data,currentNode.attribute);
        for i in range(2):            
            currentNode.children[i] = node(childrenData[i],childrenAttributes);
            split(currentNode.children[i]);

关键部分可能是:

for i in range(2):            
    currentNode.children[i] = node(childrenData[i],childrenAttributes);
    split(currentNode.children[i]);

根据我的理解,构造函数调用应返回对新创建的节点对象的引用,该对象与父节点的引用绝不相同,因为它是一个NEW对象。

节点对象是:

class node:    
    data = None;
    attributes = None;    
    attribute = None;    
    children = [None,None];

    def __init__(self,data,attributes):
        self.data = data;
        self.attributes = attributes;

由于我是Python新手,并且在oop方面没有太多经验,我希望我在这方面有一些误解,但我无法弄清楚如何指定问题。感谢。

2 个答案:

答案 0 :(得分:1)

嘿托比亚斯,这是Anjana。

问题可能与节点类声明(或定义或其他)中的数据,属性,属性和子类定义为类级属性有关吗?这意味着当您创建新的Node对象时,Node.children值将不会更改,并且对于实例化Node类的任何对象,例如, thisnode = Node(),thisnode.children将与所有其他节点对象相同(thisnode.children = Node.children)

如果您希望每个节点对象都不同,那么您必须在 init 方法中设置它(如self.children)。

不确定是否与此有任何关系......请告诉我。

答案 1 :(得分:0)

解决方案:Python OOP与Java OOP不同!将类定义更改为:

class node:
def __init__(self,data,attributes):
    self.data = data;
    self.attributes = attributes;
    self.children = [None,None];
    self.attribute = None;