为何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
相关产品推荐
相关产品推荐

