Python实现幂集时list append操作异常的原因及解决方法
问题根源
Python 中的列表属于可变对象,你调用ans.copy()执行的是浅拷贝:仅拷贝了外层ans列表的结构,内层的子列表仍然和原列表中的子列表指向同一块内存地址。
你在修改后半部分子列表的时候,前半部分和它指向同一对象的子列表也会同步被修改,最终就出现了所有元素同步更新的问题。
结合你的输入[0,1]可以验证执行逻辑:
- 第一次处理元素
0时,ans.extend(ans.copy())后得到的[[], []]中两个空列表是同一个引用,给索引1的子列表追加0后,两个子列表都变成[0],此时ans = [[0], [0]] - 第二次处理元素
1时,ans.extend(ans.copy())后得到四个[0],全部指向同一引用,给后两个子列表追加1的操作会作用到所有子列表上,最终得到你看到的全相同的异常输出。
修复方法
只需要在扩展ans的时候,对内层每个子列表单独做拷贝,保证新旧子列表是独立的对象即可,修改后的代码如下:
def powerset(array): ans = [[]] for elem in array: # 遍历当前ans的每个子列表,拷贝后再扩展 ans.extend([sub.copy() for sub in ans]) for j in range(int(len(ans)/2), len(ans)): ans[j].append(elem) return ans
测试输入[0,1],返回结果为[[], [0], [1], [0, 1]],符合预期。
内容的提问来源于stack exchange,提问作者Mathphile
相关产品推荐
相关产品推荐

