Python中的递归函数不会更改列表[重复]

Posted

技术标签:

【中文标题】Python中的递归函数不会更改列表[重复]【英文标题】:Recursive function in Python does not change list [duplicate] 【发布时间】:2016-08-08 22:19:56 【问题描述】:

我在带有累加器的列表列表上使用递归函数,但不是创建正确的列表列表,而是创建一个列表,其中包含插入累加器中的最后一项的重复项。我在一个更简单的递归函数和列表中重新创建了这个问题。该函数获取一个列表并复制 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']]

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

【问题讨论】:

正确的输出是什么? 正确的输出是进入累加器的列表。这与输出中“错误打印列表:”行之前的打印内容相同。 递归函数的目的是什么? 它只是创建 2 个副本,每 n 次反转字符串。 【参考方案1】:
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']]

【讨论】:

请不要使用list作为变量名。 更通用的解决方案:[MyList for i in range(a)] 其中 a 是所需的独立列表的数量。仅当您要初始化诸如数字或 None 之类的可散列项列表时才使用 * 运算符,而不是用于列表列表。 问题是我实际上是这样做的,因为我需要一个包含 2*n 个 x 副本的列表,所以我一直在做 temp = [x]*(2*n)。有什么替代方案? @AbdalahEl-Barrad 就像迈克尔说的:[x.copy() for i in range(n * 2)] 但是,如果 x 是一个数字,* 运算符就可以了。

以上是关于Python中的递归函数不会更改列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有列表的Python递归返回无[重复]

Python列表递归更改

Python递归函数相关

递归序列python

函数——基本语法,嵌套匿名高阶递归函数

需要列表的原始长度作为 Haskell 中的“变量”,但它会随着递归而不断变化 [重复]