不使用deepcopy函数的“深层复制”嵌套列表

时间:2011-10-21 05:01:41

标签: python deep-copy nested-lists

我正在尝试复制嵌套列表a,但不知道如何在没有的情况下使用copy.deepcopy函数执行此操作。

a = [[1, 2], [3, 4]]

我用过:

b = a[:]

b = a[:][:]

但他们都变成浅色副本。

任何提示?

5 个答案:

答案 0 :(得分:8)

我的模拟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行, 无法处理所有内容。

答案 1 :(得分:5)

如果只有一个级别,您可以使用LC。

b = [x[:] for x in a]

答案 2 :(得分:1)

这是一个完整的作弊 - 但适用于“基元”列表 - 列表,字符串,字符串,数字:

def cheat_copy(nested_content):
  return eval(repr(nested_content))

可能需要考虑这个因素 - 它不会特别快。

答案 3 :(得分:0)

我找到了一种使用递归的方法。

def deep_copy(nested_content):
    if not isinstance(nested_content,list):
        return nested_content
    else:
        holder = []
        for sub_content in nested_content:
            holder.append(deep_copy(sub_content))
        return holder

答案 4 :(得分:0)

对于递归版本,您必须跟踪辅助列表并每次返回。