在 Python 中,深拷贝和浅拷贝都是对对象的复制操作,但它们之间有着本质的区别。主要的区别在于复制对象时是否同时复制了对象内部的子对象。
-
浅拷贝(Shallow Copy):
- 浅拷贝只复制对象的顶层属性,如果对象内部还有子对象,那么这些子对象不会被复制,而是会被共享。
- 在 Python 中,使用
copy
模块的copy()
函数或对象的copy()
方法可以实现浅拷贝。 - 浅拷贝的速度通常比深拷贝快,因为它只复制了对象的顶层属性。
示例:
import copy | |
original_list = [1, 2, [3, 4]] | |
shallow_copy_list = copy.copy(original_list) | |
print(original_list) # [1, 2, [3, 4]] | |
print(shallow_copy_list) # [1, 2, [3, 4]] | |
original_list[2][0] = 5 | |
print(original_list) # [1, 2, [5, 4]] | |
print(shallow_copy_list) # [1, 2, [5, 4]] |
在上面的示例中,我们可以看到,修改 original_list
中的子对象(列表 [3, 4]
)也会影响 shallow_copy_list
,因为它们共享同一个子对象。
-
深拷贝(Deep Copy):
- 深拷贝会复制对象的所有层级的属性,包括对象内部的子对象。这意味着深拷贝会创建一个与原始对象完全独立的新对象。
- 在 Python 中,使用
copy
模块的deepcopy()
函数可以实现深拷贝。 - 深拷贝通常比浅拷贝慢,因为它需要复制对象的所有层级的属性。
示例:
import copy | |
original_list = [1, 2, [3, 4]] | |
deep_copy_list = copy.deepcopy(original_list) | |
print(original_list) # [1, 2, [3, 4]] | |
print(deep_copy_list) # [1, 2, [3, 4]] | |
original_list[2][0] = 5 | |
print(original_list) # [1, 2, [5, 4]] | |
print(deep_copy_list) # [1, 2, [3, 4]] |
在上面的示例中,我们可以看到,修改 original_list
中的子对象不会影响 deep_copy_list
,因为它们不共享子对象。
总结:浅拷贝只复制对象的顶层属性,而深拷贝会复制对象的所有层级的属性。在选择使用浅拷贝还是深拷贝时,需要根据具体的需求和场景来决定。如果对象内部没有需要修改的子对象,或者子对象可以被共享,那么使用浅拷贝可以提高效率。如果对象内部有需要修改的子对象,并且希望修改不影响原始对象,那么应该使用深拷贝。