如何以一种结果列表是新对象而不是旧对象的引用的方式复制列表(或任何其他类型)?作为一个例子,我有以下列表列表:
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[:]
无法解决问题。我希望有一些新的子列表,这些列表独立于它们的起源,并且在改变时对它们的老伙伴没有影响。我怎么能这样做我的python?
答案 0 :(得分:2)
通常,复制嵌套数据结构以便复制所有引用(而不仅仅是顶级引用)的最佳方法是使用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))
答案 1 :(得分:-1)
要复制列表,您需要复制列表。
l += [list(x) for x in l]