我有一个意外的结果,其中self.path
和self.path_temp
的值不同,并且它们唯一不同的唯一方法是一个由字符串更新,另一个由全部通过函数{{ 1}}作为参数。列表是否以某种方式持久保存在python的内存中?正确或详细的解释将不胜感激!
PS:正确的是trav
,它是用字符串更新的。
self.path
答案 0 :(得分:2)
区别在于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]
,因为那样的话,您将再次忽略原始列表。