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

Tompkins-Paige算法代码问题:打印排列正常但列表仅追加初始值

嘿,我知道你遇到的问题啦!这其实是Python里可变对象的引用特性在搞鬼~

你看,当你执行listp.append(p)的时候,并没有把p当前的内容复制一份存进列表,而是把p这个列表的引用加了进去。也就是说,listp里的每一项其实都指向同一个列表对象——就是你一开始定义的p。后面你每次修改p的内容,listp里的所有元素都会跟着变,最后看起来就全是初始的[1,2,3,4]了。

解决办法很简单:存副本不存引用

你只需要在追加的时候,创建p的一个副本就行,Python里有几种轻松的方式:

  • 用切片:p[:],这是最常用的列表副本写法
  • 用list(p)把原列表转成新列表
  • 如果是嵌套列表的话可以用copy模块,但你这里是简单列表,前两种就够

修改后的代码

把listp.append(p)改成listp.append(p[:])就搞定了,完整代码如下:

import numpy as np
n = 4
p = [i for i in range(1,n+1)]
c = [1 for i in range(1,n+1)]
i = 2
print(p)
listp = []
while i <= n:
    shift = np.roll(p[:i],-1)
    for k in range(len(shift)):
        p[k] = shift[k]
    if c[i-1] < i:
        c[i-1] += 1
        i = 2
        print(p, c, i )
        listp.append(p[:])  # 这里改成添加副本
    else:
        c[i-1] = 1
        i += 1

# 现在可以正确输出所有排列了
print("\n生成的所有排列:")
for perm in listp:
    print(perm)

为啥之前打印p是对的?

因为每次print(p)的时候,Python会输出p当前的内容,但listp里存的只是指向p的“指针”。当你后续修改p,listp里的元素也会同步更新,直到循环结束,p回到初始状态,所以最后listp里全是初始值。而存副本之后,每个元素都是独立的列表,不会再被后续修改影响啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:12:45