【问题标题】:An object is being treated as NoneType in Python 2.7.6在 Python 2.7.6 中,对象被视为 NoneType
【发布时间】:2015-07-11 07:50:00
【问题描述】:

有一个类Tree234,它只有一个成员_pRoot,它是一个节点类型的对象。这里的 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 将其分配给 Node 类型对象

我已经花了几个小时试图弄清楚,但我仍然不知道这里发生了什么。所以决定问问各位。 我知道这里有一个非常愚蠢的东西,这导致了问题。但是想不通。

你能在这里找到问题吗?

【问题讨论】:

  • 那么pCurNode.getParent()self.getNextChild(pCurNode, dValue) 返回什么?其中一个返回了None,之后您循环回到while 循环并得到错误。

标签: python object nonetype


【解决方案1】:

(添加评论作为答案)

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

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

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

可能无法找到下一个孩子。

对于节点可能无法找到任何下一个子节点或父节点的其他语句(因此返回None-like 值)也是如此。

最后在插入这样的检查之前:

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

【讨论】:

  • 这可能是罪魁祸首,我相信 OP 假设这发生在循环的第一次迭代中,更有可能的答案是 getNextChild() 或 getParent() 方法返回 None .
  • @Nate,但他说直接用变量测试时,它可以工作,之后会失败
  • 对,是的,错过了,所以这就是他的假设,对此答案 +1,这是他问题的最可能原因。
  • @NikosM。你的猜测是对的,因为 isLeaf() 中的一个基本缺陷,循环没有在叶子块中退出。这是一个天真的错误 :-/ 刚刚更正了该代码并更正了所有其他错误,现在我的 Tree234 正在蓬勃发展 :) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2014-01-03
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多