python递归附加到列表

问题描述 投票:0回答:3

我试图在每次电流变化时附加电流以掌握电流。我使用列表失败。我已经能够修改字符串并将其他字符串附加到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]]
python list recursion append
3个回答
0
投票

这是您想要的:

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列表时,它会添加到所有引用都指向的一个列表中。

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


1
投票

原因是您要将current列表的引用附加到主文件。因此,每次更改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

您可以尝试这个。无需跟踪要附加到currentmaster列表。

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

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

方法2

如果您热衷于使用current,请尝试此操作。此代码click here.的可视化>

Image 2

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

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

方法3

或者您可以尝试一下。

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

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

方法4

如果要返回[[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)

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

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

0
投票

尝试下面的代码,

© www.soinside.com 2019 - 2024. All rights reserved.