为了账号安全,请及时绑定邮箱和手机立即绑定

意外的结果树遍历 - Python

意外的结果树遍历 - Python

Smart猫小萌 2023-06-06 17:19:55
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)
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

不同之处在于它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],因为那样您将再次使原始列表静音。


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信