2025-09-20
Python
00
请注意,本文编写于 94 天前,最后修改于 94 天前,其中某些信息可能已经过时。

目录

什么是浅拷贝?
示例
什么是深拷贝?
示例
什么时候使用浅拷贝?
示例
什么时候使用深拷贝?
示例
深拷贝和浅拷贝的性能考虑
测试性能
结语

在 Python 中,拷贝对象时可能会遇到深拷贝和浅拷贝的概念。这两者之间的区别对于理解如何有效地管理和操作数据非常重要。本文将详细解释深拷贝和浅拷贝的概念,并通过示例展示它们在实际编程中的应用。

什么是浅拷贝?

浅拷贝(shallow copy)是创建一个新的对象,但它包含对原始对象中子对象的引用。换句话说,浅拷贝只拷贝对象本身,而不拷贝对象内部的复杂子对象。

示例

python
python复制代码 import copy # 创建一个包含嵌套列表的列表 original_list = [1, 2, [3, 4], 5] # 进行浅拷贝 shallow_copied_list = copy.copy(original_list) # 修改原始列表中的嵌套列表 original_list[2][0] = 'changed' print("Original List:", original_list) # 输出: [1, 2, ['changed', 4], 5] print("Shallow Copied List:", shallow_copied_list) # 输出: [1, 2, ['changed', 4], 5]

在上述示例中,修改原始列表中的嵌套列表也会影响浅拷贝的列表,因为它们共享相同的嵌套列表对象。

什么是深拷贝?

深拷贝(deep copy)是创建一个新的对象,同时递归地拷贝所有子对象。这样,新对象和原始对象之间没有任何共享的子对象。

示例

python
python复制代码 import copy # 创建一个包含嵌套列表的列表 original_list = [1, 2, [3, 4], 5] # 进行深拷贝 deep_copied_list = copy.deepcopy(original_list) # 修改原始列表中的嵌套列表 original_list[2][0] = 'changed' print("Original List:", original_list) # 输出: [1, 2, ['changed', 4], 5] print("Deep Copied List:", deep_copied_list) # 输出: [1, 2, [3, 4], 5]

在上述示例中,修改原始列表中的嵌套列表不会影响深拷贝的列表,因为它们拥有各自独立的嵌套列表对象。

什么时候使用浅拷贝?

浅拷贝适用于以下情况:

  • 对象较为简单,不包含嵌套的复杂子对象。
  • 不需要担心子对象的变更影响到拷贝的对象。

示例

python
python复制代码 import copy original_list = [1, 2, 3, 4, 5] shallow_copied_list = copy.copy(original_list) original_list[0] = 'changed' print("Original List:", original_list) # 输出: ['changed', 2, 3, 4, 5] print("Shallow Copied List:", shallow_copied_list) # 输出: [1, 2, 3, 4, 5]

什么时候使用深拷贝?

深拷贝适用于以下情况:

  • 对象复杂,包含嵌套的子对象。
  • 需要确保拷贝的对象和原始对象完全独立。

示例

python
python复制代码 import copy original_dict = { 'key1': [1, 2, 3], 'key2': {'inner_key': 'value'} } deep_copied_dict = copy.deepcopy(original_dict) original_dict['key1'][0] = 'changed' original_dict['key2']['inner_key'] = 'new_value' print("Original Dict:", original_dict) # 输出: {'key1': ['changed', 2, 3], 'key2': {'inner_key': 'new_value'}} print("Deep Copied Dict:", deep_copied_dict) # 输出: {'key1': [1, 2, 3], 'key2': {'inner_key': 'value'}}

深拷贝和浅拷贝的性能考虑

深拷贝由于需要递归拷贝所有子对象,通常比浅拷贝更耗时且更消耗内存。因此,在性能敏感的场景下,应该谨慎使用深拷贝。

测试性能

python
python复制代码 import time import copy # 创建一个嵌套列表 large_list = [[i for i in range(1000)] for _ in range(1000)] # 测试浅拷贝性能 start_time = time.time() shallow_copied_list = copy.copy(large_list) end_time = time.time() print("Shallow Copy Time:", end_time - start_time) # 测试深拷贝性能 start_time = time.time() deep_copied_list = copy.deepcopy(large_list) end_time = time.time() print("Deep Copy Time:", end_time - start_time)

结语

了解深拷贝和浅拷贝的区别及其应用场景对于编写高效和正确的 Python 程序至关重要。浅拷贝适用于简单对象或不需要深层次复制的情况,而深拷贝适用于复杂对象且需要完全独立副本的场景。

希望这篇文章能帮助你更好地理解 Python 中的深拷贝和浅拷贝。如果你有任何疑问或建议,欢迎在评论区留言。

本文作者:Dewar

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!