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

Python回溯求解全排列:直接append(curr)为何返回空结果?

全排列问题中append(curr)与append(curr[:])的差异解析

在求解全排列问题时,你会发现直接用ans.append(curr)会得到空结果,换成ans.append(curr[:])才返回正确答案,你的代码如下:

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def backtrack(curr):
            if len(curr) == len(nums):
                ans.append(curr)
                # ans.append(curr[:])
                return
            for num in nums:
                if num not in curr:
                    curr.append(num)
                    backtrack(curr)
                    curr.pop()

        ans = []
        backtrack([])
        return ans

问题根源:Python列表的引用特性

Python里的列表是可变对象,当你执行ans.append(curr)时,并没有把curr当前的内容复制一份存入ans,而是把curr这个列表的内存引用加进了ans。也就是说,ans里的所有元素其实都指向同一个列表对象。

在回溯过程中,每次递归返回后都会执行curr.pop(),这个操作会直接修改curr指向的那个列表。当整个回溯流程结束时,curr已经被一步步pop回空列表了,而ans里的所有元素都是这个空列表的引用,所以最终返回的ans全是空结果。

为什么curr[:]能解决问题?

curr[:]是Python里创建列表浅拷贝的常用写法,它会生成一个和curr当前内容完全相同的新列表。把这个新列表append进ans后,就算后续修改原curr,也不会影响已经存入ans的这个新列表——因为它们是两个独立的对象,内存地址不同。这样每次符合条件时,存入ans的都是curr当时状态的快照,最终就能得到正确的全排列结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:42:05