复制而不在python中引用

时间:2016-06-12 06:30:42

标签: list python-2.7 reference duplicates

如何以一种结果列表是新对象而不是旧对象的引用的方式复制列表(或任何其他类型)?作为一个例子,我有以下列表列表:

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?

2 个答案:

答案 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]