递归中的python理解列表

递归中的python理解列表,python,Python,我有一个递归函数,它遍历一棵树并收集一个列表。我不明白为什么我必须将“列表”转换为列表。我在代码中添加了一条注释。删除list()将导致一个空列表 class TreeNode: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right def find_paths(r, sum): def helper(root, su

我有一个递归函数,它遍历一棵树并收集一个列表。我不明白为什么我必须将“列表”转换为
列表
。我在代码中添加了一条注释。删除
list()
将导致一个空列表

class TreeNode:
  def __init__(self, val, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

def find_paths(r, sum):

  def helper(root, summ, path, paths):
    if not root:
      return

    path.append(root.val)

    if not root.left and not root.right and summ == root.val:
      """
      if I print path

      [12, 7, 4]
      [12, 1, 10]
      """
      # why is list() necessary here
      paths.append(list(path))

    else:
      helper(root.left, summ - root.val, path, paths)  
      helper(root.right, summ - root.val, path, paths)

    del path[-1]

  paths = []
  helper(r, sum, [], paths)
  return paths

def main():

  root = TreeNode(12)
  root.left = TreeNode(7)
  root.right = TreeNode(1)
  root.left.left = TreeNode(4)
  root.right.left = TreeNode(10)
  root.right.right = TreeNode(5)
  sum = 23
  print("Tree paths with sum " + str(sum) +
        ": " + str(find_paths(root, sum)))


main()
这样做
paths.append(path)
将导致此问题
树路径的总和为23:[],[]

方法
列表(路径)
在执行以下操作时创建列表的副本:

paths.append(list(path))
paths.append(path)
当您执行以下操作时,实际上是在添加列表的副本:

paths.append(list(path))
paths.append(path)
您正在将引用附加到列表中,因此在中修改它时:

del path[-1]

它会影响添加到
路径的引用

请添加一个示例,如果该示例失败,则最好添加一个没有列表的示例。可能是因为list(path)创建了列表的副本。@DanielMesejo我添加了一个示例,我只是将list(path)更改为path[:],这是创建副本的另一种方式,因此在执行path时,它与复制列表有关。append(path)将引用附加到path,因此基本上如果在任何其他调用中修改它,它变为empty.nice,因此每次它被传递到堆栈时,它都会添加一个引用,因为它是从另一个函数调用的。非常感谢。