Python获取子集
当我只想修改Python获取子集,python,Python,当我只想修改新集合中的元素时,新集合和工作集合都被修改了,有人能解释一下原因吗?是不是因为数组中的元素也是数组,而且它们是浅拷贝的?如果是这样的话,我真的应该使用deepcopy(),还是我做错了什么?是因为数组中的元素也是数组,而且是浅拷贝的吗 对 浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关: 浅复制构造一个新的复合对象,然后(尽可能)在其中插入引用,指向在原始复制中找到的对象 深度副本构造一个新的复合对象,然后递归地将在原始副本中找到的对象的副本插入其中
新集合
中的元素时,新集合
和工作集合
都被修改了,有人能解释一下原因吗?是不是因为数组中的元素也是数组,而且它们是浅拷贝的?如果是这样的话,我真的应该使用deepcopy()
,还是我做错了什么?是因为数组中的元素也是数组,而且是浅拷贝的吗
对
浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:
浅复制构造一个新的复合对象,然后(尽可能)在其中插入引用,指向在原始复制中找到的对象
深度副本构造一个新的复合对象,然后递归地将在原始副本中找到的对象的副本插入其中
(强调矿山)
你刚刚复制了第二级参考资料。您需要在每个级别上执行复制,因此深度复制中的递归非常重要
您可以使用以下代码():
subsets()
应该返回什么?
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
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)