Python类中递归嵌套函数执行后类属性回退到初始值问题求解
问题根因
这不是递归或者类属性作用域的问题,本质是Python可变对象的引用传递特性导致的:
- 代码里
currentPath是列表类型,属于可变对象,你执行self.minPath = currentPath时,并没有复制列表里的内容,只是让self.minPath和currentPath指向了内存里的同一个列表对象 - 递归到终点赋值完成后,函数还会继续执行后续的回溯逻辑,也就是
currentPath.pop()操作,这个操作会修改两个变量指向的同一个列表,等整个递归全部执行完时,currentPath里的元素已经被全部弹出,自然self.minPath也变成空列表 - 而
minPathSum是整数类型(不可变对象),赋值时会直接复制值,不受后续操作影响,所以输出正常
你写的非递归测试代码没有复现问题,是因为你直接给tstArray赋值了新的列表常量,没有后续修改该列表的操作,所以结果符合预期。
修复方案
只需要在给self.minPath赋值时,对currentPath做一次浅拷贝即可,三种写法任选其一:
# 写法1:用copy方法 self.minPath = currentPath.copy() # 写法2:用list构造 self.minPath = list(currentPath) # 写法3:用切片 self.minPath = currentPath[:]
修改后完整运行的输出为:
Output: 7 1->3->1->1
如果递归顺序调整也会输出另一条和为7的路径1->1->4->2->1,属于正常情况。
内容的提问来源于stack exchange,提问作者Justin Palagi
相关产品推荐
相关产品推荐

