不使用deepcopy函数深度复制嵌套列表
我想复制一个嵌套列表 a
,但是我不知道怎么做才能 不 使用 copy.deepcopy
这个函数。
a = [[1, 2], [3, 4]]
我用了:
b = a[:]
还有
b = a[:][:]
但是它们都只是浅拷贝。
有没有什么建议?
5 个回答
2
这其实是个完全的作弊方法——但对于“基本数据类型”的列表,比如列表、字典、字符串和数字,这个方法是有效的:
def cheat_copy(nested_content):
return eval(repr(nested_content))
不过要注意,这样做有很大的安全隐患,而且速度也不会特别快。使用 json.dumps 和 loads 方法会更安全一些。
7
如果只有一个层级的话,你可以使用一个 LC。
b = [x[:] for x in a]
9
这是我用来模拟 copy.deepcopy
的方法:
def deepcopy(obj):
if isinstance(obj, dict):
return {deepcopy(key): deepcopy(value) for key, value in obj.items()}
if hasattr(obj, '__iter__'):
return type(obj)(deepcopy(item) for item in obj)
return obj
我的思路是:遍历传入对象的每一个元素,如果遇到可以再遍历的元素,就继续深入,创建与原来元素相同类型的新对象。
我并不保证这个方法是完美无缺的[1](不要传入一个引用了自己的对象!),但这应该能帮你入门。
[1] 真的!这里的重点是演示,而不是覆盖所有可能的情况。copy.deepcopy
的源代码有50行长,它也没有处理所有情况。