背景
在做一道easy题,二叉树的中序遍历,我提交的代码如下
from typing import (Optional,List
)# Definition for a binary tree node.
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right
class Solution:def __init__(self,res:List[int]=[]):self.res = resdef inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:if root is None:return []self.inorderTraversal(root.left)self.res.append(root.val)self.inorderTraversal(root.right)return self.res
测试用例的第三个把我看蒙了
后面的3,2,1哪里来的???在本地运行,结果就是[1]
解决过程
直到我问了神奇海螺,得到以下回复
https://chat.openai.com/share/6e9e7fc7-d99c-425a-994e-f8c95882d46e
你遇到的问题很有可能是因为在
Solution
类的构造函数中默认使用了可变的默认参数。在 Python 中,如果使用可变对象(如列表)作为函数或方法的默认参数,该对象只会在函数定义时创建一次。之后的每次调用,如果不指定该参数,都会使用同一个默认对象。这就可能导致你在 LeetCode 上进行多个测试时,前一次的结果影响了后一次的测试。在你的代码中,
Solution
类的__init__
方法使用了一个列表作为默认参数。因此,如果你创建多个Solution
实例而不重置res
,每个实例都会共享同一个res
列表,从而导致结果累加。解决这个问题的一个方法是在构造函数中不使用可变的默认参数,而是将
res
初始化为None
,然后在方法体内检查并初始化它。这样每个实例都会拥有自己的res
列表。
解决方案
将构造函数改成
def __init__(self,res:Optional[List[int]]=None):if res is None:res = []self.res = res