You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:42:01