如何纠正递归函数中的"TypeError: 'NoneType' object is not subscriptable"?


def Ancestors (otu,tree):
    if tree[otu][0][0] == None:
       return []
    else:
        return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)

问题本质上是,在某些时候,该函数尝试调用一个 None 的东西,这会发生,而不是函数返回我想要的列表。我以为 if 语句已经解释了这一点,但似乎我错了。有什么建议吗?

Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    Ancestors('A',a)
  File "C:x.py", line 129, in Ancestors
    return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
  File "C:x.py", line 129, in Ancestors
    return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
  File "C:x.py", line 129, in Ancestors
    return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
  File "C:x.py", line 129, in Ancestors
    return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
  File "C:x.py", line 126, in Ancestors
    if tree[otu][0][0] == None:
TypeError: 'NoneType' object is not subscriptable

这就是树

{'A': [('AD', 4.0), None, None], 'C': [('ADBFGC', 14.5), None, None], 'B': [('BF', 0.5), None, None], 'E': [('ADBFGCE', 17.0), None, None], 'D': [('AD', 4.0), None, None], 'G': [('BFG', 6.25), None, None], 'F': [('BF', 0.5), None, None], 'ADBFG': [('ADBFGC', 6.25), ('AD', 4.25), ('BFG', 2.0)], 'BF': [('BFG', 5.75), ('B', 0.5), ('F', 0.5)], 'ADBFGC': [('ADBFGCE', 2.5), ('ADBFG', 6.25), ('C', 14.5)], 'ADBFGCE': [None, ('ADBFGC', 2.5), ('E', 17.0)], 'BFG': [('ADBFG', 2.0), ('BF', 5.75), ('G', 6.25)], 'AD': [('ADBFG', 4.25), ('A', 4.0), ('D', 4.0)]}

没有引用树中的任何字符串。

这仅仅意味着treetree[otu]tree[otu][0]的计算结果为 None,因此不可下标。很可能是tree[otu]tree[otu][0].通过一些简单的调试来跟踪它,如下所示:

def Ancestors (otu,tree):
    try:
        tree[otu][0][0]
    except TypeError:
        print otu, tre[otu]
        raise
    #etc...

或 PDB

你传递给Ancestors的一个值在某个时候变得None,所以检查otutreetree[otu]tree[otu][0]是否在函数的开头None,而不仅仅是检查tree[otu][0][0] == None。但也许你应该重新考虑你的行动路径和有问题的数据类型,看看你是否可以稍微改进结构。

当你打电话给Ancestors('A',a)时,a是什么?如果a['A']为"无",或者"a['A'][0]"为"无",则会收到该异常。

相关内容

最新更新