Python中的递归函数不会更改列表

时间:2016-08-08 22:19:56

标签: python list recursion user-defined-functions

我在带有累加器的列表列表中使用递归函数,但它不是创建正确的列表列表,而是创建一个列表,其中包含在累加器中插入的最后一项的重复项。我在一个更简单的递归函数和列表中重新创建了这个问题。此函数获取列表列表并生成2个副本并将其反转n次。

def recursauto(x, n, instSet):
    #Base Case
    if(n==0):
        instSet.append(x)
        print(x) #Print to see what SHOULD be added
    else:
        temp = [x]*(2)  # Make a list with 2 copies of the original list
        for i in range(len(temp)):
            temp[i][i] = temp[i][i][::-1] # Make the list backwards
        for i in range(2):
            recursauto(temp[i], n-1, instSet) #Input each element

MyList = [] #Empyt list for accumulator
print("Correct output:")
recursauto([["A", "l", "e", "x"], ["A", "b", "d", "a", "l", "a", "h"]], 2, MyList)

print("Wrong printed list:")
for i in MyList:
    print(i) #Print what is in the accumulator

输出错误,累加器没有正确的东西。

Correct output:
[['A', 'l', 'e', 'x'], ['A', 'b', 'd', 'a', 'l', 'a', 'h']]
[['A', 'l', 'e', 'x'], ['A', 'b', 'd', 'a', 'l', 'a', 'h']]
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']]
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']]
Wrong printed list:
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']]
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']]
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']]
[['x', 'e', 'l', 'A'], ['h', 'a', 'l', 'a', 'd', 'b', 'A']]

我知道有一种更简单的方法可以做到这一点,但我实际制作的功能需要递归。就像我说的,这只是对我遇到的问题的简化再现。

1 个答案:

答案 0 :(得分:3)

temp = [x]*(2)

以上行不会创建原始列表的两个副本的列表;实际上,它只是两次存储对同一原始列表的引用。如果您需要x的独特副本,请尝试使用列表复制构造函数,例如temp = [list(x), list(x)]或浅层copy method [x.copy() x.copy()]

见下面的例子。

>>> ls = ['a']
>>> dup = [ls] * 2
>>> dup
[['a'], ['a']]
>>> ls.append('b')
>>> dup
[['a', 'b'], ['a', 'b']]