有一个类Tree234只有一个成员_pRoot,它是一个Node类型的对象。这里的Node本身就是一个类。
现在,当我尝试在Tree234类的任何方法中直接使用_pRoot时,它正在工作。但是,当我尝试通过一个临时变量将它等同于_pRoot时,它就无效了。
以下是相关的代码:
class Tree234:
#_pRoot = None
def __init__(self):
self._pRoot = Node()
def find(self, key):
pass
def insert(self, dValue):
pCurNode = self._pRoot
pTempItem = DataItem(dValue)
while True:
if pCurNode.isFull():
self.split(pCurNode)
pCurNode = pCurNode.getParent()
pCurNode = self.getNextChild(pCurNode, dValue)
elif pCurNode.isLeaf():
break
else:
pCurNode = self.getNextChild(pCurNode, dValue)
pCurNode.insertItem(pTempItem)
insert()中的第一个语句没有做它应该做的事情。当控件到达while循环中的第一个语句时,遇到以下错误:
AttributeError:'NoneType'对象没有属性'isFull'
如果我只用这个替换while循环中的第一个语句(只是为了测试):
if self._pRoot.isFull():
它接受该属性并向前移动(为其他此类语句引发相同的错误,如此处的elif条件中的那个)
所以在这里很明显pCurNode
被视为None类型,而不是我使用语句pCurNode = self._pRoot
这是几个小时我想弄清楚,但我仍然没有丝毫想到这里发生了什么。所以决定问你fellas。 我知道这里有一些非常愚蠢的东西,导致问题。但无法弄清楚。
你能在这里找到问题吗?
答案 0 :(得分:4)
(添加评论作为答案)
您应该检查pCurNode is not None
子句中while
是否while pCurNode:
:while pCurNode is not None:
或else:
pCurNode = self.getNextChild(pCurNode, dValue)
这是您的问题。
这是因为循环可能不会在叶子中退出,而且这个语句
None
无法找到下一个孩子。
类似地,对于节点可能无法找到任何下一个子节点或父节点的其他语句(因此返回类似if pCurNode and pCurNode.isLeaf(): # insert data here
的值)。
最后插入这样的支票:
[
{
"itemId":"{BA26159A-194D-4A3C-9D1A-DA9472F11BE0}",
"selected":true
},
{
"itemId":"{E651D0CD-0E7E-4903-8E26-0D1D5A168E69}",
"selected":false
},
{
"itemId":"{E651D0CD-0E7E-4903-8E26-0D1D5A168E70}",
"selected":false
}
]