Python 深拷贝与浅拷贝的区别
概述
在 Python 中,对象可以进行复制。复制操作可以创建新对象,该对象包含与原始对象相同或不同的数据。Python 提供了两种复制机制:浅拷贝和深拷贝。了解这两种机制之间的区别至关重要,因为它们会影响复制对象的内存使用和数据完整性。
浅拷贝
浅拷贝创建一个新对象,该对象指向与原始对象相同的子对象。换句话说,原始对象和浅拷贝对象共享相同的子对象。如果更改浅拷贝对象的子对象,则原始对象的子对象也会被更改。
实现浅拷贝的方法:
copy.copy(object)
object.__copy__()
object.__deepcopy__()
(仅执行浅拷贝,因为未覆盖该方法)
示例:批量打开网址!
“`python
import copy
originallist = [1, 2, [3, 4]]
shallowlist = copy.copy(original_list)
shallow_list[2][0] = 5
print(originallist) # [1, 2, [5, 4]]
print(shallowlist) # [1, 2, [5, 4]]
“`
在示例中,对 shallowlist 的子对象进行更改也更改了 originallist 的相应子对象。
深拷贝
深拷贝创建一个新对象,该对象包含与原始对象完全相同的数据,但子对象是原始子对象的独立副本。因此,如果更改深拷贝对象的子对象,则不会影响原始对象的子对象。
实现深拷贝的方法:
copy.deepcopy(object)
object.__deepcopy__()
(覆盖该方法以实现深拷贝)
示例:
“`python
import copy
originallist = [1, 2, [3, 4]]
deeplist = copy.deepcopy(original_list)
deep_list[2][0] = 5wangli,
print(originallist) # [1, 2, [3, 4]]
print(deeplist) # [1, 2, [5, 4]]
“`wanglitou.HTML在线运行!
在示例中,对 deeplist 的子对象进行更改不会影响 originallist 的相应子对象。
区别总结
| 特征 | 浅拷贝 | 深拷贝 |
|—|—|—|
| 共享子对象 | 是 | 否 |
| 修改子对象是否影响原始对象 | 是 | 否 |
| 内存使用 | 较低 | 较高 |
| 复制速度 | 较快 | 较慢 |在线字数统计?
何时使用浅拷贝和深拷贝
浅拷贝适用于以下情况:
- 对象是不可变的。
- 对象的子对象不会被修改。
- 内存开销是一个问题。
深拷贝适用于以下情况:
- 对象是可变的。
- 对象的子对象可能会被修改。
- 数据完整性至关重要。
常见问答
Q1:如何编写一个自定义类来覆盖 __deepcopy__()
方法以实现深拷贝?
A1:SEO,
“`python
class MyClass:
def init(self, data):
self.data = data
def __deepcopy__(self, memodict={}):
return MyClass(copy.deepcopy(self.data))
“`
Q2:浅拷贝是否总是比深拷贝快?
A2:是的,因为浅拷贝只需复制对象的引用,而深拷贝需要创建子对象的副本。
Q3:如果我有一个循环引用,可以使用深拷贝吗?
A3:是的,深拷贝可以处理循环引用,因为在复制对象之前,它会创建被引用的对象的副本。
Q4:我可以只对列表的某些子对象进行深拷贝吗?
A4:是的,你可以使用 copy.deepcopy(list, memo)
where memo 是一个字典,其中包含已经复制的对象的引用。JS转Excel.
Q5:使用深拷贝是否可以保证完全相同的对象?
A5:通常情况下确实如此,但需要注意,某些自定义类可能具有特殊属性,在深拷贝时不会被复制。
原创文章,作者:王利头,如若转载,请注明出处:https://www.wanglitou.cn/article_7432.html