Home > Enterprise >  Discrepancy of list append in python
Discrepancy of list append in python

Time:04-28

I am getting a different result when I am using append(path) vs. append(list(path))

I have the following code to find all paths for a sum:

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


def find_paths(root, sum):
  allPaths = []
  
  dfs(root, sum, [], allPaths)

  return allPaths

def dfs(root, sum, path, res):
  if not root:
    return
  
  path.append(root.val)
  if root.val == sum and root.left is None and root.left is None:
    res.append(path)
  
  dfs(root.left, sum - root.val, path, res)
  dfs(root.right, sum - root.val, path, res)

  del path[-1]
  

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()

This has the following output:

Tree paths with sum 23: [[], []]

But if I change the res.append(path) to res.append(list(path)) which will then return the correct answer Tree paths with sum 23: [[12, 7, 4], [12, 1, 10]]. I am confused on why using the list operation would change the answer.

CodePudding user response:

res.append(path) appends the object path itself to the list res. After that line, when you modify the path object (like del path[-1]), the modification is also applied to the appended object in res, because, well, they are the same object.

list(path), on the other hand, "copies" the path. So this one is now a different object from path. When you modify path after that, the modification does not propagates to this different object.

You will have the same result if you do path[:] or path.copy() instead of list(path).

CodePudding user response:

res.append(path) appends the actual path object, not a copy of it. So if path changes later on, the change will appear in res also.

res.append(list(path)) appends a copy.

  • Related