意外的结果树遍历 - Python
Unexpected Result Tree Traversal - Python
我有一个意想不到的结果,其中 self.path
和 self.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]
,因为那样您又会忽略原始列表。
我有一个意想不到的结果,其中 self.path
和 self.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]
,因为那样您又会忽略原始列表。