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

递归函数执行后subsets为何全为空列表?

问题解决:Python子集收集后全为空列表的原因与修复

你遇到的问题核心是Python中可变对象的引用特性:列表是可变类型,你往subsets里append的是subset这个列表的引用,而不是它的副本。后续的del subset[-1]操作会修改这个同一个列表对象,递归结束后所有引用指向的都是被清空的那个列表,所以最后subsets里全是空列表。

对应你熟悉的Java里new ArrayList<>(subset)的操作,Python里需要显式创建subset的副本,常用的几种方式:

  • 使用列表的copy()方法:subsets.append(subset.copy())
  • 用list()构造函数:subsets.append(list(subset))
  • 切片语法:subsets.append(subset[:])

修改后的代码如下:

subset = []
subsets = []

def search(k, n):
    if k == n and subset:
        # 添加副本而非原列表的引用
        subsets.append(subset.copy())
    else:
        search(k + 1, n)
        subset.append(k)
        search(k + 1, n)
        del subset[-1]

search(0, 5)
# 此时subsets会正确包含[0,1,2,3,4]的所有非空子集
print(subsets)

补充说明:你之前加global关键字没用,因为问题根本不是变量作用域——你本来就已经在操作全局的subset,只是添加的是引用而非副本,和作用域无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:55:58