我发现基本上有四种方法可以用于在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
list
、dict
、用户类等-并且您必须对其进行处理,请确保使用深度复制以避免出现以下情况:>>> 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]]