You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者임정섭

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:55:35