意外的结果树遍历 - Python

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


PS:正确的是self.pathwhich is updated with the string.



    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)


Smart猫小萌
浏览 104回答 1
1回答

慕哥6287543

不同之处在于它path是一个原始值(一个字符串)而temp不是。当你做path += str(root.val)您实际上是在创建一个新字符串。字符串在 Python 中是不可变的。同样,函数的调用者也看不到path它作为参数传递的变量的任何变化。这是一个不同的故事temp。当你做temp.append(root.val)...你正在改变temp列表。这是调用者作为参数传递的列表,因此调用者的列表会被此操作改变。在所有的递归过程中,有几个temp变量实例,但它们都引用同一个列表。Everyappend影响所有temp变量实例。如果你想temp表现得像path,那么你必须创建一个新列表而不是改变现有列表:temp = temp + [root.val]注意:不要将其缩短为temp += [root.val],因为那样您将再次使原始列表静音。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python