Python - 不使用复制模块

时间:2017-10-11 23:01:54

标签: python python-3.x

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

我是一个介绍班的初学者,我老老实实地在努力学习这个。我们真正被告知的唯一一件事就是我们应该使用递归来解决这个问题,但是在被困了这么长时间之后,我想我会寻求帮助。

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

3 个答案:

答案 0 :(得分:2)

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

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]

答案 1 :(得分:0)

这是一个单行答案:

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

答案 2 :(得分:0)

可以使用这一行方法进行深拷贝

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

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