Python - 不使用复制模块的深度复制



本质上,问题是创建一个函数deepcopy(L),它将返回列表L的深层副本。但是,我们被告知不要使用复制模块或其中的任何功能。

我是入门课的完全初学者,老实说,我正在为此苦苦挣扎。我们唯一真正被告知的是我们应该使用递归来解决问题,但在被困了这么长时间之后,我想我会寻求帮助。

在课堂上无法弄清楚,也没有真正得到明确的答案,现在教授正在继续前进,所以任何帮助将不胜感激。谢谢。

也许,您正在寻找这样的东西:

def mydeepcopy(L):
    if isinstance(L, list):
        ret = []
        for i in L:
            ret.append(mydeepcopy(i))
    elif isinstance(L, (int, float, type(None), str, bool)):
        ret = L
    else:
        raise ValueError("Unexpected type for mydeepcopy function")
    return ret
lst = [ [1,2,3], [4,5,6], [7,8,9] ]
copy = mydeepcopy(lst)
print("Original Data: %s" % (lst))
print("Original IDs: %s = %s" % (id(lst),[ id(i) for i in lst ]))
print("Copied Data: %s" % (copy))
print("Copied IDs: %s = %s" % (id(copy),[ id(i) for i in copy ]))

可能的输出:

Original Data: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Original IDs: 140637274065288 = [140637274064712, 140637274064776, 140637274065352]
Copied Data: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Copied IDs: 140637274065480 = [140637274065416, 140637274065160, 140637274065096]

可以使用这种单行方法完成深度复制,

def deep_copy(source_list):
    dest_list = source_list[:]
    return dest_list

它为您提供了更小的功能并减少了处理时间。

我想

指出一个事实,即表演

dest_list = source_list[:]

不会创建深拷贝

要证明这一点,请尝试执行以下操作:

>>> list1 = [[1,2,3], [4,5,6], [7,8,9]]
>>> list2 = list1[:]
>>> id(list1) == id(list2)
False
>>> id(list1[0]) == id(list2[0])
True

由于嵌套对象只是引用的副本,因此此操作分类为浅拷贝

这是一个单行答案:

newList = [L[i] for i in range(len(L))]

最新更新