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_sets
和new_sets
都被修改了吗?是因为数组中的元素也是数组,并且它们被轻微复制了?如果是这样的话,我应该真的使用deepcopy()
还是我做错了什么?
答案 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)