LeetCode113 Path Sum II中append(path)与append(path[:])结果差异原因
两种写法的核心差异及错误原因
这是Python中可变对象引用传递的典型特性导致的结果,具体说明如下:
- 首先明确:你代码中作为路径容器的
path是列表类型,属于Python的可变对象,整个递归回溯过程中,所有对path的增删操作都是修改同一个内存地址里的列表对象,传递的始终是该列表的引用。
1. result.append(path)的错误逻辑
当你直接把path追加到result时,实际只是把path的内存引用存入了结果集,并没有保存当前path的瞬时内容。后续回溯阶段执行path.pop()操作修改原列表时,result中已经存入的所有引用指向的内容会同步被修改,递归完全结束后,path会被回溯清空,最终result里存储的所有元素都会指向同一个空列表或者最终状态的列表,和预期的路径集合完全不符。
2. result.append(path[:])的正确逻辑
path[:]是Python列表的全切片操作,会基于当前path的内容生成一个内容完全一致的新列表对象,相当于做了一次浅拷贝。你追加到result中的是新列表的引用,后续对原path的所有增删操作都不会影响已经存入结果集的新列表,所以可以正确保留每个符合条件的叶子节点对应的路径瞬时状态。
你可以通过下面的极简示例验证这个特性:
result = [] path = [1,2,3] # 直接追加引用的情况 result.append(path) path.pop() print(result) # 输出:[[1, 2]],结果跟着原列表变化 # 追加切片拷贝的情况 result = [] result.append(path[:]) path.pop() print(result) # 输出:[[1, 2]],结果不会跟着原列表变化
内容的提问来源于stack exchange,提问作者ManMan Zhang
相关产品推荐
相关产品推荐

