递归中的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,因此每次它被传递到堆栈时,它都会添加一个引用,因为它是从另一个函数调用的。非常感谢。