这是一个相当具体的问题,但由于我无法弄清楚这里发生了什么,让我告诉你这个问题:
越来越多的决策树,我有一个拆分节点的分裂函数,即它将两个子节点连接到一个节点。出于某种原因,下面的代码将节点本身分配为子节点,使得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方面没有太多经验,我希望我在这方面有一些误解,但我无法弄清楚如何指定问题。感谢。
答案 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;