Python获取子集

时间:2016-03-14 01:22:46

标签: python

def subsets(arr):
    n = len(arr)
    if n == 0:
        return [[]]

    els_except_last = arr[:n-1]
    last_el = arr[n-1]

    working_sets = subsets(els_except_last)

    new_sets = working_sets[:]
    for s in new_sets:
        s.append(last_el)

    # HERE: both new_sets and working_sets are modified

    result = [new_sets, working_sets]

    return result

当我打算修改new_sets中的元素时,有人可以解释为什么working_setsnew_sets都被修改了吗?是因为数组中的元素也是数组,并且它们被轻微复制了?如果是这样的话,我应该真的使用deepcopy()还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

是因为数组中的元素也是数组,并且它们被浅层复制了吗?

https://docs.python.org/2/library/copy.html

  

浅层复制和深层复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:

     

浅复制构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中找到的对象。

     

深层复制构造一个新的复合对象,然后递归,将原件中的对象的副本插入其中。

(强调我的)

您刚刚制作了二级参考文献的新副本。您需要在每个级别上执行复制,因此深层复制中的递归非常重要。

您可以使用以下代码(live):

import copy
last_el = 0
working_sets = [[1],[2],[3],[4],[5]]
#new_sets = copy.deepcopy(working_sets)
new_sets = working_sets[:]
for s in new_sets:
    print(id(s))
for s in working_sets:
    print(id(s))

for s in new_sets:
    s.append(last_el)

print(new_sets)
print(working_sets)