有一个类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' object has no attribute 'isFull'
如果我只是用这个替换 while 循环中的第一条语句(只是为了测试):
if self._pRoot.isFull():
它接受属性并向前移动(为其他此类语句引发相同的错误,例如此处的 elif 条件中的错误)
所以这里很明显 pCurNode
被视为 None 类型,而不是我使用语句 pCurNode = self._pRoot
将它分配给 Node 类型对象这一事实>
我已经花了几个小时才弄明白,但我仍然一点也不知道这里发生了什么。所以决定问问你们。 我知道这里有一些非常愚蠢的东西,导致了问题。但是想不通。
你能找到这里的问题吗?
最佳答案
(添加评论作为答案)
您应该检查 while
子句中的 pCurNode 是否为 None
,如下所示:while pCurNode:
或 while pCurNode is not无:
这是你的问题。
发生这种情况是因为循环可能不会在叶子中退出,而这个语句
else:
pCurNode = self.getNextChild(pCurNode, dValue)
可能找不到下一个 child 。
对于节点可能无法找到任何下一个子节点或父节点的其他语句(因此返回类似 None
的值)。
最后在插入这样的支票之前:
if pCurNode and pCurNode.isLeaf(): # insert data here
关于python - 对象在 Python 2.7.6 中被视为 NoneType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987567/