具有相同输入的递归函数提供不同的输出

时间:2019-11-18 19:21:59

标签: python python-3.x recursion

我写了一个Python函数来反转嵌套列表:

def ReverseList(inputlist,parent=[]):

    if len(inputlist)==0:
        tem_out=parent[:]
        return tem_out

    else:
        next_i=inputlist[-1]

        if type(next_i) == list:
            parent.append(ReverseList(next_i,[]))
        else:
            parent.append(next_i)

        temp_par=parent[:]
        return ReverseList(inputlist[:-1],temp_par)


print(ReverseList([1,2,[11,22],3,5]))
print(ReverseList([1,2,[11,22],3,5]))
print(ReverseList([1,2,[11,22],3,5]))
print(ReverseList([1,2,[11,22],3,5]))

在最后4行中,我用相同的输入重复调用了相同的函数。它给出以下输出:

[5, 3, [22, 11], 2, 1]
[5, 5, 3, [22, 11], 2, 1]
[5, 5, 5, 3, [22, 11], 2, 1]
[5, 5, 5, 5, 3, [22, 11], 2, 1]

仅在第一个输出中显示正确答案。

为什么每次调用该函数时都添加相同的元素?

1 个答案:

答案 0 :(得分:1)

自变量列表中的表达式parent=[]被认为是危险的默认值,因为它默认为容器,因此出于某种原因应避免使用你发现了。相反,我们可以将parent初始化为None并进行测试,并根据需要将其设为空列表:

def reverseList(inputList, parent=None):

    if parent is None:
        parent = []

    if not inputList:
        return parent

    *head, tail = inputList

    if isinstance(tail, list):
        parent.append(reverseList(tail))
    else:
        parent.append(tail)

    return reverseList(head, parent)


if __name__ == '__main__':

    array = [1, 2, [11, 22], 3, 5]
    print(array)

    print(reverseList(array))
    print(reverseList(array))
    print(reverseList(array))
    print(reverseList(array))

    print(array)

还请注意使用某些Python3语法和首选的isinstance测试。