【问题标题】:How to make a copy of a list of objects not change when modifying the original list? [duplicate]修改原始列表时如何使对象列表的副本不更改? [复制]
【发布时间】:2011-09-30 13:32:40
【问题描述】:

可能的重复:
How to clone a list in python?
What is the best way to copy a list in Python?

original_list = [Object1(), Object2(), Object3()]
copy_list = original_list
original_list.pop()

如果我从原始列表中删除了一个对象,我怎样才能防止副本列表也发生变化?

原始列表

[<Object.Object instance at 0x00EA29E0>, <Object.Object instance at 0x00EA2DC8>, <Object.Object instance at 0x00EA2EE0>]

弹出原始列表后复制列表(我希望它等于上面的)

[<Object.Object instance at 0x00EA29E0>, <Object.Object instance at 0x00EA2DC8>]

【问题讨论】:

    标签: python list object


    【解决方案1】:

    这会起作用。

    import copy
    copy_list = copy.copy(original_list)
    

    还有

    copy_list = list(original_list)
    

    【讨论】:

      【解决方案2】:

      使用copy.deepcopy() 进行深层复制:

      import copy
      copy_list = copy.deepcopy(original_list)
      

      对于浅拷贝使用copy.copy():

      import copy
      copy_list = copy.copy(original_list)
      

      或没有指定端点的切片:

      copy_list = original_list[:]
      

      请参阅copy docs 了解有关深拷贝和浅拷贝的说明。

      【讨论】:

      • copy.copy()其实是浅拷贝,copy.deepcopy()是深拷贝
      • @Paul Woolcock:感谢您的关注。我已经更正了答案。
      • 请注意,切片也是浅拷贝,因为没有明确说明:stackoverflow.com/a/19068714/3249197
      【解决方案3】:

      使用deepcopy

      返回 x 的深层副本。

      from copy import deepcopy
      
      original_list = [Object1(), Object2(), Object3()]
      copy_list = deepcopy(original_list)
      original_list.pop()
      

      但请注意,在您的情况下切片会更快:

      copy_list = original_list[:]
      

      【讨论】:

        猜你喜欢
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        相关资源
        最近更新 更多