【问题标题】:Else statement is called after return in recursive call递归调用中返回后调用 Else 语句
【发布时间】:2020-06-30 16:57:34
【问题描述】:

我正在尝试从列表中递归删除具有相同值的项目。它是部分工作的,但是当它到达返回时,它仍然在它之后执行else语句并返回None。 我有兴趣以递归方式完成此任务。

def remove_from_list(item, lst):
    if item not in lst:
        return (item, lst)
    else:
        lst.remove(item)
        nw = lst[:]
        remove_from_list(item, nw)

lst = [7, 6, 5, 4, 3, 4, 5, 41] 

remove_from_list(6, lst)

任何线索为什么会发生这种情况?

【问题讨论】:

    标签: python-3.x recursion


    【解决方案1】:

    如果你返回递归调用返回的值,你的函数将返回修改后的列表而不是 None:

    def remove_from_list(item, lst):
        if item not in lst:
            return (item, lst)
        else:
            lst.remove(item)
            nw = lst[:]
            return remove_from_list(item, nw)
    

    一点解释:

    在python中,每个函数在到达函数末尾时都返回None。我已经修改了您的代码以使其更易于理解:

    def remove_from_list(item, lst):
        if item not in lst:
            return (item, lst)
        else:
            lst.remove(item)
            nw = lst[:]
            remove_from_list(item, nw)
        return None
    

    这里,调用remove_from_list(item, nw)的结果既没有存储,也没有返回,所以是'丢失',python继续return None语句。

    【讨论】:

    • 是的,这行得通,谢谢@rulerofthehuns。你能帮我理解为什么会这样吗,似乎当它到达返回时它应该停止进一步执行,对吗?
    • 在python中,每个函数在到达函数末尾时都返回None。在您的代码中,没有返回第二个 remove_from_list() 调用的结果,因此执行继续到函数末尾,其中自动返回 None。
    • @rulerofthehuns,我认为您应该将注释解释移到您的答案中,因为它肯定突出了代码工作的原因。另外,欢迎来到 SO :)
    • 我已经按照@HarisNadeem 的建议修改了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-01-04
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多