如何复制列表(或任何其他类型)的列表,以便生成的列表是新对象,而不是对旧对象的引用?例如,我有以下列表:
l=[[1,2],[3,4]]我想要的结果是:
l=[[1,2],[3,4],[1,2],[3,4]]如果我做了l*=2,新的子列表就是对旧子列表的引用。执行l[0].append("python")将导致
l=[[1,2,'python'],[3,4],[1,2,'python'],[3,4]]还创建了一个新的列表,如:
l2=list(l)或
l2=l[:]解决不了问题。我想有一个新的子列表,它们独立于它们的起源,并且在变化时对它们的老伙伴没有任何影响。我该怎么做我的蟒蛇?
发布于 2016-06-12 07:13:14
通常,复制嵌套数据结构以便复制所有引用(而不仅仅是顶层引用)的最佳方法是使用copy.deepcopy。在嵌套列表示例中,可以这样做:
l.extend(copy.deepcopy(l))即使数据结构包含对自身的引用或对同一对象的多个引用,deepcopy仍然可以工作。它通常也适用于作为自定义类实例中的属性存储的对象。如果您想要给出类特殊的复制行为,可以定义一个__deepcopy__方法(例如,如果它的一些属性是簿记数据,不应该被复制)。
下面是嵌套列表示例代码的一个版本,它使用的是链接列表类的实例,而不是Python的list。copy.deepcopy做了正确的事情!
class linked_list(object):
def __init__(self, value, next=None):
self.value = value
self.next = next
def __repr__(self):
if self.next is not None:
return "({!r})->{!r}".format(self.value, self.next)
else:
return "({!r})".format self.value
lst = linked_list(linked_list(1, linked_list(2)),
linked_list(linked_list(3, linked_list(4))))
print(lst) # prints ((1)->(2))->((3)->(4))
lst.next.next = copy.deepcopy(lst)
print(lst) # prints ((1)->(2))->((3)->(4))->((1)->(2))->((3)->(4))
lst.value.value = 5
print(lst) # prints ((5)->(2))->((3)->(4))->((1)->(2))->((3)->(4))https://stackoverflow.com/questions/37771375
复制相似问题