python递归追加到列表

时间:2020-01-18 16:29:17

标签: python list recursion append

我试图在每次电流变化时附加电流以掌握电流。我使用列表失败。我已经能够修改字符串并将其他字符串附加到master上,但是如果可以使用list的话,会容易得多。

master = []

def recur(count,current):
    count = count + 1
    if (count == 5):
        return
    current.append(1)
    master.append(current)
    recur(count,current)


recur(0,[])

print(master)
# out put
# [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]

# what I expected
# [[1], [1,1], [1,1,1], [1,1,1,1]]

3 个答案:

答案 0 :(得分:1)

这就是您想要的:

master = []

def recur(count, current):
    count += 1
    if (count == 5):
        return

    new_current = current.copy()

    new_current.append(1)
    master.append(new_current)

    recur(count, new_current)


recur(0, [])

print(master)

问题在于current是对列表对象的引用,而不是实际列表本身。因此,当您将current附加到master时,您只是将引用附加到同一列表对象。因此,当您将新元素添加到current列表时,该元素将添加到所有引用都指向的一个列表中。

解决方案是采用current中的copy列表来存储当时的状态。 copy有不同类型-深浅。浅将复制列表对象,但不复制其元素,例如,如果您具有列表列表,则深复制将遍历元素和任何子元素。

答案 1 :(得分:0)

尝试下面的代码,

master = []

def recur(count, current):
    count += 1
    if (count == 5):
        return
    tmp = current[:]
    tmp.append(1)
    master.append(tmp)
    recur(count, tmp)

recur(0, [])

master

输出

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

答案 2 :(得分:0)

原因是您要将current列表的引用附加到master。因此,每次更改current时,先前附加的列表也会更改。

使用此链接进行可视化:click here

enter image description here

>>>def recur(count,current):
    count = count + 1
    if (count == 5):
        return
    current.append(1)
    master.append(current)
    recur(count,current)


>>> master=[]
>>> recur(0,[])
>>> master
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> for i in master:
    id(i)


2485591104264
2485591104264
2485591104264
2485591104264
>>> 

方法1

您可以尝试一下。无需跟踪要附加到current的{​​{1}}列表。

master

def recur(count):
    count+=1
    if count==5:
        return
    curr=[1]*count
    #print(curr)
    master.append(curr)
    recur(count)
master=[]
recur(0)
print(master)

方法2

如果您热衷于使用[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]] ,请尝试一下。 可视化代码click here.

Image 2

current

def recur(count,curr):
    count+=1
    if count==5:
        return
    curr.append(1)
    master.append(curr)
    recur(count,curr[:])
master=[]
recur(0,[])
print(master)

方法3

或者您可以尝试这个。

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

def recur(count,curr):
    count+=1
    if count==5:
        return
    curr.append(1)
    master.append(curr[:])
    recur(count,curr)
master=[]
recur(0,[])
print(master)

方法4

如果您想返回[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]] ,请尝试此操作。

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

def recur(count,curr):
    count+=1
    if count==5:
        return []
    curr.append(1)
    return [curr]+recur(count,curr[:])
master=recur(0,[])
print(master)
another_master=recur(0,[])
print(another_master)