0

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

生长决策树,我有一个拆分节点的拆分函数,即将两个子节点附加到一个节点。出于某种原因,下面的代码将节点本身分配为子节点,这样 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]);

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

节点对象是:

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

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

由于我是 Python 中的 oop 新手,并且总体上对 oop 不是很有经验,所以我希望我在这方面有一些误解,但我不知道如何指定问题。谢谢。

4

2 回答 2

1

嘿托拜厄斯,我是安佳娜。

问题是否与在节点类声明(或定义或其他任何内容)中将数据、属性、属性和子项定义为类级别属性的事实有关?这意味着当您创建一个新的 Node 对象时,Node.children 的值不会改变,并且对于任何实例化 Node 类的对象,例如 thisnode = Node(),thisnode.children 将与所有其他节点对象相同( thisnode.children = Node.children)

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

不知道这是否与它有关......让我知道。

于 2013-01-21T11:25:31.843 回答
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;
于 2013-01-21T17:00:01.277 回答