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

Python生成全排列时print输出正常append后元素全相同是什么原因

问题原因

核心是Python可变对象的引用传递特性,具体逻辑如下:

  • 你代码中传入的排列对象是列表,属于可变对象,整个递归、回溯过程里所有的swap操作都是直接修改同一个列表的内存内容,全程没有生成新的列表实例。
  • 生成器yield返回的是这个列表的引用,而非当前状态的副本。循环中print(x)时打印的是当前时刻列表的实时内容,所以每次输出都符合预期,但result.append(x)只是将列表的引用存入结果数组,并没有复制当前的列表内容。
  • 递归的回溯步骤swap(perm,i,x)最终会将列表还原为初始状态,结果数组中存储的所有引用都指向同一个最终被还原的列表,因此最终打印result时所有元素完全一致。
修复方案

只需要在yield时返回当前列表的副本即可,将permutations函数中的yield string修改为yield string.copy()或者yield list(string)。

修复后的关键代码片段:

def permutations(string ,i=0):
    if i == len(string):
        # 返回当前列表的副本而非原引用
        yield string.copy()

    for x in range(i, len(string)):
        perm = string
        swap(perm,x,i)
        yield from permutations(perm, i+1)
        swap(perm,i,x)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:24:07