LeetCode打家劫舍Python代码本地与平台运行输出不一致问题
运行结果差异的根本原因
核心问题出在Python可变默认参数的初始化机制,结合LeetCode的判题运行逻辑共同导致了结果差异:
- Python函数的默认参数只会在函数首次被定义时完成一次初始化,后续所有函数调用都会复用同一个默认参数对象,不会在每次调用时重置。代码里把记忆化缓存
memo设为空字典的可变默认参数,本身就存在缓存污染的隐患。 - 本地IDE运行时,通常是单次触发函数执行、跑单组测试用例:函数第一次定义时
memo是空字典,整个递归流程里写入memo的都是当前测试用例的计算缓存,没有其他调用干扰,所以输入[2,7,9,3,1]能算出正确结果12。 - LeetCode判题时会在同一个Python进程内,连续调用提交的
rob函数跑完所有测试用例,不会每跑一个用例就重新加载、定义函数。跑完前序测试用例后,作为默认参数的memo字典里已经残留了之前用例的索引对应缓存值,跑后续用例时这些旧缓存会被直接读取复用,根本不会基于当前输入的nums重新计算,自然会输出完全不符合预期的错误结果,遇到的输出4就是缓存污染导致的计算错乱。
修复方案
改掉可变默认参数的写法,避免跨调用的缓存残留,同时递归调用时透传缓存对象即可:
def rob(nums, current=0, memo=None): # 每次外部新调用rob时,重新初始化空的缓存字典 if memo is None: memo = {} if current >= len(nums): return 0 if current in memo: sum1 = memo[current] else: sum1 = nums[current] + rob(nums, current + 2, memo) memo[current] = sum1 if current + 1 >= len(nums): return sum1 if current + 1 in memo: sum2 = memo[current + 1] else: sum2 = nums[current + 1] + rob(nums, current + 3, memo) memo[current + 1] = sum2 return max(sum1, sum2)
调整后同一次调用的递归流程会共用同一个缓存,不同测试用例调用时缓存完全隔离,就不会出现跨用例的结果干扰。
内容的提问来源于stack exchange,提问作者Hi-man
相关产品推荐
相关产品推荐

