np.copy(obj) vs obj.copy() vs copy.copy(obj) vs copy.deepcop

  • 本文关键字:copy vs obj deepcop np python-3.x
  • 更新时间 :
  • 英文 :


我发现基本上有四种方法可以用于在Python中复制对象
我不太清楚这四者之间的区别。

请有人从地面解释一下差异。

谢谢。

TL;DR他们在复制方法上有所不同:

  • 浅拷贝:
    • numpy.copy()
    • (dict | list | ...).copy()
    • copy.copy()
  • 深度复制:
    • copy.deepcopy()

还有目的:

  • 复制数据结构:
    • numpy.copy()
    • (dict | list | ...).copy()
  • 复制对象(数据结构⊂对象(:
    • copy.copy()
    • copy.deepcopy()

Plus,如果存在,copy.copy()copy.deepcopy()将分别在内部调用obj.__copy__()obj.__deepcopy__()方法-这意味着用户类可以控制复制行为。


关于Shallow copy&深度复制

python中有两种复制:浅复制

深复制来自Python文档:

浅复制和深度复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例(相关:

  • 浅副本构建一个新的复合对象,然后(在可能的范围内(在其中插入对原始对象的引用

  • 深度复制构建一个新的复合对象,然后递归地将原始对象的副本插入其中。

当我们复制类实例时,这种差异最能体现出来。

>>> class SomeClass:
...     pass
>>> a = [SomeClass()]
>>> b = a.copy()
>>> a[0] == b[0]
True
>>> id(a[0])
2778700770576
>>> id(b[0])
2778700770576
# Not actually copied, referencing to same instance.
>>> import copy
>>> a = [SomeClass()]
>>> b = copy.deepcopy(a)
>>> a[0] == b[0]
False
>>> id(a[0])
2778695702544
>>> id(b[0])
2778717746032
# Actually copied into different instance

对于浅层复制,如果您的数据包含复合对象-最常见的是listdict、用户类等-并且您必须对其进行处理,请确保使用深度复制以避免出现以下情况:

>>> a = [[0], [0]]
>>> b = a.copy()
>>> b[0].append(10)
>>> a
[[0, 10], [0]]
>>> b
[[0, 10], [0]]
# ---
>>> a = [[0], [0]]
>>> b = copy.deepcopy(a)
>>> b[0].append(10)
>>> a
[[0], [0]]
>>> b
[[0, 10], [0]]

最新更新