【问题标题】:Duplicating without referencing in python在python中复制而不引用
【发布时间】:2023-03-03 20:27:01
【问题描述】:

如何复制列表列表(或任何其他类型)以使结果列表是新对象而不是对旧对象的引用?例如,我有以下列表:

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[:]

不能解决问题。我希望有新的子列表,它们独立于它们的来源,并且在更改后对其旧伙伴没有影响。我怎么能做到这一点?

【问题讨论】:

    标签: list python-2.7 reference duplicates


    【解决方案1】:

    一般来说,复制嵌套数据结构以便复制所有引用(不仅仅是顶级引用)的最佳方法是使用copy.deepcopy。在您的嵌套列表示例中,您可以这样做:

    l.extend(copy.deepcopy(l))
    

    deepcopy 即使数据结构包含对自身的引用或对同一对象的多个引用,仍然可以工作。它通常也适用于作为属性存储在自定义类实例上的对象。如果您想为类提供特殊的复制行为(例如,如果它的某些属性是不应复制的簿记数据),您可以定义 __deepcopy__ 方法。

    这是嵌套列表示例代码的一个版本,它使用链表类的实例而不是 Python lists。 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 2011-02-23
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多