Python 如何纠正;类型错误:';非类型';对象不可下标";在递归函数中?
问题的本质是,在某个时刻,函数试图调用一个无的东西,而不是返回我想要的列表。我原以为if的陈述说明了这一点,但似乎我错了。有什么建议吗Python 如何纠正;类型错误:';非类型';对象不可下标";在递归函数中?,python,Python,问题的本质是,在某个时刻,函数试图调用一个无的东西,而不是返回我想要的列表。我原以为if的陈述说明了这一点,但似乎我错了。有什么建议吗 def Ancestors (otu,tree): if tree[otu][0][0] == None: return [] else: return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree) otu引用树中的任何字符串。当调用祖先('a',
def Ancestors (otu,tree):
if tree[otu][0][0] == None:
return []
else:
return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
otu引用树中的任何字符串。当调用
祖先('a',a)
时,什么是a
?如果a['a']
为None,或者a['a'][0]
为None,您将收到该异常。您传递给祖先的值之一在某一点上变为None
,因此检查otu
树、树[otu]
或树[otu][0]
是函数开头的None
,而不是只检查树[otu][0][0]==None
。但是,也许您应该重新考虑您的行动路径和所讨论的数据类型,看看是否可以稍微改进结构。这仅仅意味着树
,树[otu]
,或树[otu][0]
的计算结果为无
,因此是不可订阅的。最有可能的是树[otu]
或树[otu][0]
。通过一些简单的调试来跟踪它,如下所示:
{'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)]}
或者一般来说,当你得到一个TypeError
时,这意味着你的值不是你想象中的值。这是一个使用调试器的好地方。我试着按照您的建议进行调试,但每个值都会正常返回。据我所知,递归函数最终会命中一个None值,但我认为我的if语句说明了这一点?根据stacktrace,您的if
语句实际上是引发错误的地方。因为我不知道你的树的数据的性质,我只能猜测,但是我猜你实际上想要做的检查是if tree[otu]==None:
实际上是if tree[otu][0]==None,但是我们解决了它!仅供参考,我爱你。该死的,我一定变慢了,我真的应该早点看到这一点可选:或者,如果tree[otu][0]没有
<代码>=
可能会在flake8
中触发错误消息。函数中的某个值在稍后的某个点变为“无”,但在开始时没有“无”。我怎么解释呢?当然,我现在会把它添加到原始问题中,虽然很长,但它们都不是,我只是在函数中放入了一堆print语句,所有语句都返回了。我现在看到的问题是,函数并没有停止,而是继续到一个没有的点,我该如何应对呢??
{'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)]}
def Ancestors (otu,tree):
try:
tree[otu][0][0]
except TypeError:
print otu, tre[otu]
raise
#etc...