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

Python全排列程序异常求助:[1,2,3]排列返回值与初始列表一致

问题排查与修复

核心问题1:列表引用导致输出全部一致

你的代码中ans.append(nums)直接将列表nums的引用添加到结果列表中,而非当前状态的副本。因为列表是可变对象,后续对nums的修改会同步影响ans中所有已添加的元素。当最后一轮get_per将数组重新排序为[1,2,3]时,ans里的所有元素都会变成这个初始值。

修复方法:每次添加时传入列表的副本,替换为:

ans.append(nums.copy())  # 或 ans.append(list(nums))

核心问题2:get_per函数返回值错误

当处理到最后一个排列(如[3,2,1])时,rindex=-1,此时你执行return arr.sort()。但sort()是原地排序方法,返回值为None,这会导致nums被赋值为None,后续逻辑虽因k减到0停止,但属于明显逻辑错误。

修复方法:先执行原地排序,再返回数组:

if rindex == -1:
    arr.sort()
    return arr

可选优化:下一个排列的索引查找逻辑

当前get_per中寻找rindex的逻辑是从左往右遍历,记录最后一个arr[i] > arr[i-1]的位置,这在短数组中能运行,但不符合标准下一个排列算法的规范(标准算法是从右往左找第一个arr[i] < arr[i+1]的位置)。若要适配更长数组,建议修改为:

# 替换原rindex查找代码
for i in range(n-2, -1, -1):
    if arr[i] < arr[i+1]:
        rindex = i
        break
else:
    rindex = -1

修正后的完整代码

from typing import List
def permute(nums: List[int]) -> List[List[int]]:
    
    def fact(n):
        pr = 1
        for i in range(1,n+1):
            pr = pr*i
        return pr
    
    def get_per(arr):
        rindex = -1
        n = len(arr)
        # 优化后的rindex查找逻辑
        for i in range(n-2, -1, -1):
            if arr[i] < arr[i+1]:
                rindex = i
                break
        if rindex == -1:
            arr.sort()
            return arr
        pindex = rindex + 1
        # 寻找比arr[rindex]大的最小元素
        for i in range(rindex+1, n):
            if arr[i] > arr[rindex] and arr[i] < arr[pindex]:
                pindex = i
        arr[rindex], arr[pindex] = arr[pindex], arr[rindex]
        arr[rindex+1:] = sorted(arr[rindex+1:])
        return arr
    
    ans = []
    k = fact(len(nums))
    
    while k != 0:
        ans.append(nums.copy())
        print(ans)
        nums = get_per(nums)
        k -= 1
    print('-----')
    print(ans)
    print('-----')
    return ans

print(permute([1,2,3]))

运行修正后的代码,会得到正确的全排列输出:

[[1, 2, 3]]
[[1, 2, 3], [1, 3, 2]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
-----
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
-----
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:20:29