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

为何Python函数会保留set类型变量的状态?

递归函数默认集合参数复用问题的解决

问题根源

Python函数的默认参数是在函数定义时初始化的,而非每次调用时重新创建。你将assigned={"0"}设为默认参数,这个集合对象只会在函数第一次被定义时生成一次,后续所有未传入assigned的调用都会复用这个集合,导致之前遍历过的元素被保留,无法实现每次调用独立初始化的需求。

修复方案

把默认参数改为None,在函数内部判断并初始化新集合,确保每次调用未传参时都会创建全新的集合实例:

def assaignPuntuation(song, assigned=None):
    # 每次未传入assigned时,初始化新的集合
    if assigned is None:
        assigned = {"0"}
    if song in assigned:
        return assigned 
    assigned.add(song)
    
    def runthrough(songlist, song, assigned):
        for element in songlist:
            # 注意:原代码这里传的是song,应该改为当前遍历的element,否则逻辑错误
            assigned = assaignPuntuation(element, assigned=assigned)
        return assigned
    
    assigned = runthrough(song, song[4], assigned)
    # 保留原代码中其他逻辑
    return assigned

assaignPuntuation(A)
assaignPuntuation(B)

额外提示

原代码中runthrough函数的循环里,调用assaignPuntuation时传入的是song而非当前遍历的element,这会导致递归逻辑错误,始终处理同一个song对象,需要修正为element才能正确遍历列表中的元素。

内容的提问来源于stack exchange,提问作者Olexandr Kadar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:01:52