深拷贝和浅拷贝是对象拷贝的两种方式,它们在复制对象时的行为有所不同。
浅拷贝
浅拷贝创建一个新的对象,但不会递归地复制对象中的嵌套对象。这意味着新的对象会引用原对象中的嵌套对象。如果嵌套对象发生变化,浅拷贝的对象中的对应部分也会发生变化。
Python 中可以使用 copy
模块中的 copy()
方法进行浅拷贝。
import copy
original = {'a': 1, 'b': [2, 3, 4]}
shallow_copy = copy.copy(original)
print(shallow_copy) # {'a': 1, 'b': [2, 3, 4]}
shallow_copy['b'].append(5)
print(original) # {'a': 1, 'b': [2, 3, 4, 5]}
print(shallow_copy) # {'a': 1, 'b': [2, 3, 4, 5]}
深拷贝
深拷贝创建一个新的对象,并递归地复制所有嵌套对象。这样,新对象就完全独立于原对象,即使嵌套对象发生变化,深拷贝的对象也不会受到影响。
Python 中可以使用 copy
模块中的 deepcopy()
方法进行深拷贝。
import copy
original = {'a': 1, 'b': [2, 3, 4]}
deep_copy = copy.deepcopy(original)
print(deep_copy) # {'a': 1, 'b': [2, 3, 4]}
deep_copy['b'].append(5)
print(original) # {'a': 1, 'b': [2, 3, 4]}
print(deep_copy) # {'a': 1, 'b': [2, 3, 4, 5]}
区别总结
- 浅拷贝:仅复制对象的第一层,新对象中的嵌套对象仍然是对原对象中嵌套对象的引用。
- 深拷贝:递归地复制所有层级,新对象中的嵌套对象是完全独立的副本。
何时使用
- 使用浅拷贝时,适用于对象比较简单且嵌套层次不多的情况。
- 使用深拷贝时,适用于对象包含多层嵌套且需要完全独立的副本的情况。
了解深拷贝和浅拷贝的区别,有助于在编程时选择合适的拷贝方式,避免不必要的错误和数据混淆。