在递归问题中,为什么要在python列表上使用list()方法?

2024-07-02 11:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在学习Python中的深度优先搜索,有一个问题是,给定一个二叉搜索树和一个数字N,查找从根到叶的所有路径,使每个路径的所有节点值之和等于N

我做的每件事都是对的,但是我的代码不起作用(它导致了一个空的2D数组)。在查看解决方案时,唯一的区别是“allPath.append(list(currPath))”,而我编写的代码只是“allPath.append(currPath)”。当我进行此更改时,代码运行良好完整的代码如下:

def findPathSum(root, sum):
    allPath = []
    _findPathSum(root, sum, [], allPath)
    return allPath

def _findPathSum(currNode, sum, currPath, allPath):
    if currNode is None:
        return
    
    currPath.append(currNode.val)

    if currNode.val == sum and currNode.left is None and currNode.right is None:
        print(currPath)
        allPath.append(list(currPath))

    else:
        _findPathSum(currNode.left, sum-currNode.val, currPath, allPath)
        _findPathSum(currNode.right, sum-currNode.val, currPath, allPath)
    
    del currPath[-1]

我感到困惑的是currPath已经是一个列表,并且只包含整数(即节点值)。在将currPath附加到AllPath之前打印currPath时,它也会正确显示一个包含整数值的列表。然而,在我将其附加到AllPath之后,AllPath只是一个空数组。但是,出于某种原因,使用list()方法显示具有正确整数值的正确二维数组。我不知道为什么会这样

根据我的理解,list()方法只需获取一个iterable并将其转换为一个list……然而currPath已经是一个list了。我觉得我错过了一些非常明显的东西


Tags: 代码路径noneis整数val数组list
1条回答
网友
1楼 · 发布于 2024-07-02 11:39:51

list创建一个全新的列表(尽管元素不是全新的),一个新的列表对象。在您的例子中,如果不使用list,您只需在每次递归调用时向allPath添加完全相同的列表对象

因此,由于allPath的所有元素都是完全相同的列表,因此更改该列表会更改allPath的所有元素。例如,当在_findPathSum的末尾执行del currPath[-1]操作时,实际上是在删除allPath的每个元素的最后一个元素。因为最后currPath将是空的,这就是你在allPath中看到的,一个包含空列表的列表

相关问题 更多 >