Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何纠正;类型错误:';非类型';对象不可下标";在递归函数中?_Python - Fatal编程技术网

Python 如何纠正;类型错误:';非类型';对象不可下标";在递归函数中?

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',

问题的本质是,在某个时刻,函数试图调用一个无的东西,而不是返回我想要的列表。我原以为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',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...