Python 为什么这两种dfs实现会产生不同的结果?

Python 为什么这两种dfs实现会产生不同的结果?,python,depth-first-search,Python,Depth First Search,这一个给出了正确的结果: def binaryTree(root): paths = [] def dfs(root, path=""): if root: if path != "": path += "->" path += str(root.val) if not root.left and not root.right:

这一个给出了正确的结果:

def binaryTree(root):
    paths = []

    def dfs(root, path=""):
        if root:
            if path != "":
                path += "->"
            path += str(root.val)
            if not root.left and not root.right:
                paths.append(path)
            dfs(root.left, path)
            dfs(root.right, path)

    dfs(root)
    return paths # gives ['1->2->4', '1->2->5', '1->3']
在这一条中,路径列表不断增长:

def binaryTree2(root):
    paths = []

    def dfs(root, path=[]):
        if root:
            path.append(root.val)
            if not root.left and not root.right:
                paths.append("->".join(map(str, path)))
            dfs(root.left, path)
            dfs(root.right, path)

    dfs(root)
    return paths # gives ['1->2->4', '1->2->4->5', '1->2->4->5->3']
树是这样的:


唯一的区别是,在一个语句中我连接字符串,而在另一个语句中我附加到列表中。

因此在第一个实现中:所有
path+=…
语句基本上创建了一个新字符串,并使
path
指向它

至于第二个实现,您有一个一直在传递的列表。您应该在dfs返回之前弹出该节点

def binaryTree2(根目录):
路径=[]
def dfs(根目录,路径=[]):
如果根:
append(root.val)
如果不是root.left,也不是root.right:
paths.append(“->”.join(映射(str,path)))
dfs(root.left,路径)
dfs(root.right,路径)
path.pop()#这会在函数返回时清除堆栈
dfs(根目录)
返回路径
编辑:Python字符串是不可变的,即一旦创建,就不能修改

第行下面的
#实质上创建了一个指针,
#以及“path”指向的字符串对象。
path=“huhu”
#这将创建另一个字符串对象“hu123”。
#现在我们有3个字符串对象,
#“123”、“呼呼”和“呼呼123”。和一个指针'path',如果你愿意的话。
#'path'指向“huhu123”
路径+=“123”

如果我们有更多无辜的对象而不是字符串,一旦它们没有引用,它们就会被垃圾收集。字符串得到特殊处理,在我们的例子中,所有3个字符串都是内部的。

因此在第一个实现中:所有
path+=…
语句实质上创建了一个新字符串,并让
path
指向它

至于第二个实现,您有一个一直在传递的列表。您应该在dfs返回之前弹出该节点

def binaryTree2(根目录):
路径=[]
def dfs(根目录,路径=[]):
如果根:
append(root.val)
如果不是root.left,也不是root.right:
paths.append(“->”.join(映射(str,path)))
dfs(root.left,路径)
dfs(root.right,路径)
path.pop()#这会在函数返回时清除堆栈
dfs(根目录)
返回路径
编辑:Python字符串是不可变的,即一旦创建,就不能修改

第行下面的
#实质上创建了一个指针,
#以及“path”指向的字符串对象。
path=“huhu”
#这将创建另一个字符串对象“hu123”。
#现在我们有3个字符串对象,
#“123”、“呼呼”和“呼呼123”。和一个指针'path',如果你愿意的话。
#'path'指向“huhu123”
路径+=“123”

如果我们有更多无辜的对象而不是字符串,一旦它们没有引用,它们就会被垃圾收集。字符串得到特殊处理,在我们的例子中,所有3个字符串都是内部的。

我不明白为什么
path+=s
会创建一个新字符串。因为python中的字符串是不可变的。让我在回答中详细说明一下^我不明白为什么
path+=s
会创建一个新字符串。因为python中的字符串是不可变的。让我在答复中详细说明^