Python递归函数调用无法获取返回值问题排查
问题:递归函数返回值无法传递到顶层调用
我编写的Python递归函数intersection可正常迭代处理数据并将结果写入文件,但尝试获取函数最后一次调用的返回值时,变量rec始终为空。尽管函数的else分支能正常打印非空的result对象,却无法将其返回给顶层调用。代码运行于Jupyter Notebook环境,具体代码如下:
#this is an ipynb file so spacing means they are getting executed from different blocks def intersection(pre,i=0,point=0,count=0,result=dt): index=-1 prefer=[] # print(i) if(0<i): url = "../data/result.csv" result= pd.read_csv(url,names=["a","b","c","d","e"]) if(i<len(pre)): for j in result[pre[i]]: index=index+1 if(demand[pre[i]][1] >= j): prefer.append(result.iloc[index,:]) i=i+1 file = open('../data/result.csv', 'w+', newline ='') header = ["a","b","c","d","e"] writer = csv.DictWriter(file, fieldnames = header) # writing data row-wise into the csv file writer.writeheader() # writing the data into the file with file: write = csv.writer(file) write.writerows(prefer) count=count+1 # print(prefer,count) print the outputs step by step intersection(pre,i,point,count,result) else: print("Else Part",type(result)) print(result) return result # pre=["a","b","c"] rec=intersection(pre) print(rec)
请问如何让rec正确获取函数最后一次调用返回的result值?
解决方案
核心问题是递归调用时没有将子调用的返回值传递回上层调用。当你在if(i<len(pre))分支里调用intersection(...)时,只是执行了这个函数,但没有把它的返回值返回给当前层的调用者,导致顶层调用最终拿不到任何返回值(默认返回None)。
同时代码里还有两个小问题需要修正:
- 文件操作逻辑混乱:先用
DictWriter写表头,之后又用csv.writer写数据,且with块会自动关闭文件,导致表头可能无法正确写入 - 可变参数默认值陷阱:
result=dt如果是可变对象(比如DataFrame),会导致多次调用时意外复用旧状态
修改后的完整代码
import pandas as pd import csv # 假设demand和dt是已定义的全局变量 # demand = {"a": [...], "b": [...], "c": [...]} # dt = pd.DataFrame(...) def intersection(pre, i=0, point=0, count=0, result=None): index = -1 prefer = [] # 初始化或读取结果文件 if result is None: result = dt # 使用初始数据 elif 0 < i: url = "../data/result.csv" result = pd.read_csv(url, names=["a","b","c","d","e"]) if i < len(pre): # 筛选符合条件的数据(用enumerate替代手动维护index) for idx, j in enumerate(result[pre[i]]): if demand[pre[i]][1] >= j: prefer.append(result.iloc[idx, :]) i += 1 # 统一在with块内完成文件写入,避免资源泄漏 header = ["a","b","c","d","e"] with open('../data/result.csv', 'w+', newline='') as file: writer = csv.writer(file) writer.writerow(header) # 写入表头 writer.writerows(prefer) # 写入筛选后的数据 count += 1 # 关键:返回递归调用的结果,将下层返回值传递回上层 return intersection(pre, i, point, count, result) else: print("Else Part", type(result)) print(result) return result # 调用函数 pre = ["a","b","c"] rec = intersection(pre) print(rec)
关键修改说明
- 递归调用添加return:
return intersection(...)确保每一层递归都把下层的返回值传递回去,最终顶层调用能拿到最后一次递归的result - 修复文件写入逻辑:所有文件操作放在
with块内,用csv.writer统一处理表头和数据,避免文件提前关闭导致的写入失败 - 优化参数初始化:将
result默认值设为None,在函数内部判断初始化,避免可变参数默认值的陷阱
这样修改后,rec就能正确获取最后一次递归调用返回的result值了。
内容的提问来源于stack exchange,提问作者Aryaman Singh
相关产品推荐
相关产品推荐

