Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表未在助手函数中更新_Python - Fatal编程技术网

Python 列表未在助手函数中更新

Python 列表未在助手函数中更新,python,Python,我已经编写了以下代码来查找二叉树的根到叶路径。但此代码没有更新op list变量。当我使用op.extendvalue时 在helper函数中,它扩展了列表,但不确定为什么不添加列表?我希望op是一个路径列表,而路径本身就是一个列表。e、 g: [1,2,5],[1,3]] python 2.7代码: 我知道你有什么问题了@J.K.发现了什么。问题是,每当你到达一片叶子时,你都会把对currPath的引用放到op中。因为这是一个引用,所以当您以后进一步操作currPath时,所有被引用的对象都会

我已经编写了以下代码来查找二叉树的根到叶路径。但此代码没有更新op list变量。当我使用op.extendvalue时 在helper函数中,它扩展了列表,但不确定为什么不添加列表?我希望op是一个路径列表,而路径本身就是一个列表。e、 g:

[1,2,5],[1,3]]

python 2.7代码:
我知道你有什么问题了@J.K.发现了什么。问题是,每当你到达一片叶子时,你都会把对currPath的引用放到op中。因为这是一个引用,所以当您以后进一步操作currPath时,所有被引用的对象都会发生变化,即您推送到op的对象。因为在遍历树的最后,currPath是空的,所以op中的所有引用对象也是空的。要解决这个问题,只需每次将列表复制到“op”中。因此:

op.append(currPath)
应该是:

op.append(list(currPath))
我想你会得到你期望的结果

这里有一个完整的例子。在未来,这是我们希望看到的问题:

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

root = Node("A",
    Node("B",
        Node("C",
             Node("D"))),
    Node("F",
         Node("G",
              Node("H")),
         Node("I",
              None,
              Node("J")))
    )


def treepaths(root):
    op = []
    currPath = []

    def _path(root):
        if not root:
            return

        currPath.append(root.val)
        _path(root.left)

        if not root.left and not root.right:
            op.append(list(currPath))
        _path(root.right)
        currPath.pop()

    _path(root)
    return op

print(treepaths(root))
其结果是:

[['A', 'B', 'C', 'D'], ['A', 'F', 'G', 'H'], ['A', 'F', 'I', 'J']]
如果没有修复,您将获得:

[[], [], []]

我猜currPath.pop正在从op中删除路径。尝试注释这行吗?我在代码中看到了逻辑。我可以看到如何使它读得更好一点,效率更高一点,但它似乎应该起作用。你能提供代码来构建一个示例树,显示输出,并给出你的预期输出吗?换句话说,你能向史蒂夫表示感谢吗!我仍然想知道代码如何与op.extendcurrpath配合使用。很高兴我能帮上忙!使用op.extend,您将得到不同的结果。这将分别将currPath中的每个项添加到op,而不是添加列表本身。因此,在这种情况下,您只会得到一个字符串列表,而不是一个字符串列表。这是可行的,因为您必须复制单个元素才能将它们添加到ops中,所以复制引用不适用。
[[], [], []]