Python查找BST第k大值代码中minHeap默认参数与传参的差异是什么
两段代码的核心差异原因
这是Python中典型的可变类型作为函数默认参数的设计特性导致的问题:
- Python的函数默认参数是在函数定义阶段就完成绑定存储的,不是每次函数调用时重新生成。如果默认参数是列表、字典这类可变对象,所有不主动传入该参数的调用,都会共用同一个可变对象实例。
- 第一段代码给
helper的minHeap参数设置默认值[],这个空列表会在helper函数定义时就被创建并一直保留:单次调用findKthLargestValueInBst时结果看起来正常,但第二次及之后调用时,minHeap会残留上一次调用存入的元素,不会自动清空,导致运行结果错误。 - 第二段代码每次调用
helper时都会主动传入新创建的空列表[],每次调用的堆都是全新实例,不存在历史数据残留,因此结果始终符合预期。
简单复现该问题的示例
def add_item(item, lst=[]): lst.append(item) return lst print(add_item(1)) # 输出 [1] print(add_item(2)) # 实际输出 [1, 2],而非预期的 [2]
正确的默认参数写法
如果想保留默认参数的写法,可将可变默认值改为None,在函数内部初始化可变对象:
def helper(tree, k, minHeap=None): # 每次调用不传入minHeap时,都会创建全新的空列表 if minHeap is None: minHeap = [] # 后续原有逻辑不变
内容的提问来源于stack exchange,提问作者Michael Torres
相关产品推荐
相关产品推荐

