Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python获取子集_Python - Fatal编程技术网

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)