递归函数执行后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
相关产品推荐
相关产品推荐

