不使用deepcopy函数深度复制嵌套列表

5 投票
5 回答
12157 浏览
提问于 2025-04-17 04:44

我想复制一个嵌套列表 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行长,它也没有处理所有情况。

撰写回答