Python递归场景下如何不使用copy模块传递更新后的数组?
解决递归中传递数组不修改原数组的问题(无需copy模块)
嘿,这个问题我太熟悉了!直接在递归里用arr.remove(el)确实会踩可变对象引用的坑——因为列表是可变类型,传递的是内存地址,修改子函数里的数组会直接影响原数组,这完全不是我们想要的。不用copy模块的话,有几个更简洁原生的办法:
方法1:用切片生成新数组(精准匹配原逻辑)
原代码里arr.remove(el)是移除第一个出现的目标元素,如果要完全对齐这个逻辑,最稳妥的方式是通过索引切片生成新数组:
- 用
enumerate遍历数组,同时拿到元素和它的索引 - 用
arr[:idx] + arr[idx+1:]拼接出移除当前元素后的新列表,这个操作会创建全新的列表,完全不影响原数组
改进后的代码示例:
arr = [1, 1, 2, 4, 4, 4, 7, 9, 9, 13, 13, 13, 15, 15, 16, 16, 16, 19, 19, 20] num = 36 def sumsubset(arr, num, org): for idx, el in enumerate(arr): if el == org: return [el] # 生成移除当前元素的新数组,不修改原数组 new_arr = arr[:idx] + arr[idx+1:] result = [el] + sumsubset(new_arr, num - el, org) return result a = sumsubset(arr, 36, 36) print(a)
方法2:列表推导式(适合移除所有相同元素的场景)
如果你的需求是移除数组中所有和当前元素相同的值,可以用列表推导式一行生成新数组:
new_arr = [x for x in arr if x != el]
不过要注意,这个逻辑和arr.remove(el)不一样,remove只会删第一个匹配项,而推导式会删全部,根据你的实际需求选择就行。
为什么这些方法更好?
- 不需要额外导入模块,用Python原生语法就能解决
- 切片和推导式都是创建新列表,彻底避免了原数组被意外修改的风险
- 代码更简洁易读,符合Python的"优雅"风格
内容的提问来源于stack exchange,提问作者임정섭
相关产品推荐
相关产品推荐

