在做一道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 = val
- self.left = left
- self.right = right
- class Solution:
- def __init__(self,res:List[int]=[]):
- self.res = res
- def 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