我正在尝试复制嵌套列表a
,但不知道如何在没有的情况下使用copy.deepcopy
函数执行此操作。
a = [[1, 2], [3, 4]]
我用过:
b = a[:]
和
b = a[:][:]
但他们都变成浅色副本。
任何提示?
答案 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)
对于递归版本,您必须跟踪辅助列表并每次返回。