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

列表nums与nums[:]的区别?从LeetCode46全排列看差异

LeetCode第46题递归解法:nums与nums[:]的区别解析

我在解决LeetCode第46题(给定不同整数组成的数组nums,返回所有可能的全排列,顺序不限)时,写了如下递归代码:

def rec(index, nums, ans):
    if(index == len(nums)):
        ans.append(nums)
        return
    for i in range(index, len(nums)):
        nums[index], nums[i] = nums[i], nums[index]
        rec(index+1, nums, ans)
        nums[index], nums[i] = nums[i], nums[index]

当输入nums为[1,2,3]时,用ans.append(nums)得到的输出全是[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]];改成ans.append(nums[:])后,才得到正确的全排列结果。

核心区别:

  • nums是对原列表的引用:Python里列表属于可变对象,直接appendnums,相当于把这个列表的内存地址添加到ans里。递归过程中,nums会被反复交换元素、回溯还原,最终所有存在ans里的引用,指向的都是最后回溯完成的同一个列表(也就是初始的[1,2,3]),所以输出全是相同的结果。
  • nums[:]是生成原列表的浅拷贝:这会创建一个新的列表,和当前nums的内容完全一致,但占用独立的内存空间。每次append的都是当前状态下nums的副本,后续对原nums的修改不会影响这些已经存入ans的副本,因此能正确保存每一步生成的全排列。

内容的提问来源于stack exchange,提问作者Samridh Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:03:19