意外的结果树遍历 - Python

Unexpected Result Tree Traversal - Python

我有一个意想不到的结果,其中 self.pathself.path_temp 的值不同,它们唯一不同的地方是一个由字符串更新,另一个由列表更新,所有这些都通过函数传递trav 作为参数。 python 中的列表是否以某种方式持久存在于内存中?正确或详细的解释将不胜感激!

PS:正确的是self.path,用字符串更新。


    def binaryTreePaths(self, root: TreeNode) -> List[str]:
                
        self.path = []
        temp = []
        self.path_temp = []

        
        def trav(root,path,temp):
            
            if root:
                
                path += str(root.val)
                temp.append(root.val)

                if root.right == None and root.left==None:
                    self.path.append('->'.join(path))
                    self.path_temp.append('->'.join(temp))
                
                    
                trav(root.left,path,temp)
                trav(root.right,path,temp)
        
        
        trav(root,'',temp)    
        print(self.path)
        print(self.path_temp)

区别在于path是原始值(字符串)而temp不是。当你这样做时

path += str(root.val) 

您实际上是在创建一个新字符串。 Python 中的字符串是不可变的。因此,函数的调用者也不会看到它作为参数传递的 path 变量的任何变化。

temp 则不同。当你这样做时

temp.append(root.val)

...您正在改变 temp 列表。这是调用者作为参数传递的列表,因此调用者的列表会被此操作改变。在所有的递归过程中,有几个 temp 个变量实例,但它们都引用同一个列表。每个 append 都会影响所有 temp 个变量实例。

如果您希望 temp 表现得像 path,那么您必须创建一个 new 列表而不是改变现有列表:

temp = temp + [root.val]

注意:不要将其缩短为 temp += [root.val],因为那样您又会忽略原始列表。