【问题标题】:python recursion appending to listpython递归追加到列表
【发布时间】:2020-05-05 05:42:52
【问题描述】:

每次电流变化时,我都会尝试将电流附加到主控。我使用列表失败了。我已经能够修改字符串并将不同的字符串附加到 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


【解决方案1】:

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

使用此链接进行可视化:click 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
>>> 

方法一

你可以试试这个。无需跟踪您附加到mastercurrent 列表。

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]]

方法二

如果你热衷于使用current,那么试试这个。 这段代码的可视化click here.

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]]

方法四

如果你想返回[[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]]

【讨论】:

    【解决方案2】:

    试试下面的代码,

    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]]
    

    【讨论】:

      【解决方案3】:

      这就是你想要的:

      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 - 深的和浅的。浅层会复制列表对象而不是它的元素,如果你有一个列表列表,深层复制将遍历元素和任何子元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-10
        • 2023-03-21
        • 2017-12-15
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        相关资源
        最近更新 更多