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

Python中DFS代码执行时ans列表为何在lst.pop()后被修改?

列表引用导致的内容同步问题解析

问题场景

当输入N=4、M=1时,调用lst.pop()后,ans列表的内容出现类似“重置”的变化。原以为ans和lst是两个独立的列表,无法理解该现象,寻求解答。

原代码

N,M=map(int,input().split())

ans=[]
lst=[]

def dfs(num):
    global ans
    if(num==M):
        ans.append(lst)
        return

    for i in range(1,N+1):
        if(i not in lst):
            lst.append(i)
            dfs(len(lst))
            print(ans)
            lst.pop()
            print(ans)

dfs(0)

print(ans)

问题原因

Python中列表属于引用类型,你执行ans.append(lst)时,并没有把lst的内容复制一份存入ans,而是把lst这个对象的引用添加到了ans里。也就是说,ans中的所有元素其实都指向同一个lst对象。

当你调用lst.pop()修改lst时,这个唯一的lst对象的内容发生了变化,ans里保存的引用自然会同步显示出这个变化,看起来就像ans被“重置”了。

解决方法

往ans中添加lst的独立副本,而不是原引用。可以通过以下两种方式实现:

  • 使用lst.copy()方法创建副本
  • 使用切片lst[:]生成副本

修改后的关键代码如下:

if(num==M):
    ans.append(lst.copy())  # 或 ans.append(lst[:])
    return

修改后,输入N=4、M=1时,ans最终会正确保存[[1], [2], [3], [4]],后续修改lst不会再影响ans中的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:55:02