在 Python 2.7.6 中,对象被视为 NoneType

An object is being treated as NoneType in Python 2.7.6

有一个class Tree234,它只有一个成员_pRoot,它是一个Node类型的对象。这里的Node本身就是一个class.

现在,当我尝试在 Tree234 class 的任何方法中直接使用 _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[=16 将其分配给 Node 类型对象的事实=]

我花了几个小时才弄明白,但我仍然一点也不知道这里发生了什么。所以决定问问你们。 我知道这里有一些非常愚蠢的东西,导致了问题。但是想不通。

你能找到这里的问题吗?

(添加评论作为答案)

您应该像这样检查 while 子句中的 pCurNode is not Nonewhile pCurNode:while pCurNode is not None: 这是您的问题。

发生这种情况是因为循环可能不会在叶中退出,并且此语句

else:
   pCurNode = self.getNextChild(pCurNode, dValue) 

找不到下一个 child。

对于节点可能无法找到任何下一个 child 或 parent 的其他语句类似(因此返回类似 None 的值)。

最后在插入检查之前:

if pCurNode and pCurNode.isLeaf():  # insert data here