簡體   English   中英

python 理解遞歸中的列表

[英]python understanding lists in recursion

我有一個遞歸的 function 遍歷一棵樹並收集一個列表。 我不明白為什么我必須將“列表”轉換為list 我在代碼中添加了注釋。 刪除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)將導致這個Tree paths with sum 23: [[], []]

當您執行以下操作時,方法list(path)會創建列表的副本:

paths.append(list(path))

當您執行以下操作時,您實際上是在附加列表的副本:

paths.append(path)

您正在將引用附加到列表中,因此當您修改它時,如下所示:

del path[-1]

它會影響添加到paths的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM