本质上,问题是创建一个函数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))]