📜  在Python中复制(深拷贝和浅拷贝)(1)

📅  最后修改于: 2023-12-03 14:51:20.547000             🧑  作者: Mango

在Python中复制(深拷贝和浅拷贝)

在Python中,复制是常见的操作,其目的是创建一个变量副本,以便对副本进行独立的操作,而不影响原始变量。Python中的复制操作分为深拷贝和浅拷贝两种方式,本文将对这两种方式进行介绍和比较。

浅拷贝(Shallow Copy)

浅拷贝是创建一个新对象,新对象与原对象的元素是相同的引用。简单来说,浅拷贝只复制了原始对象中元素的引用,而不是元素本身。

在Python中,可以使用以下方式进行浅拷贝操作:

new_list = old_list[:]
new_dict = old_dict.copy()
new_set = old_set.copy()
示例
old_list = [1, 2, 3, [4, 5]]
new_list = old_list[:]  # 浅拷贝

# 修改原始对象的元素
old_list[0] = 10
old_list[3][0] = 40

print(old_list)  # 输出 [10, 2, 3, [40, 5]]
print(new_list)  # 输出 [1, 2, 3, [40, 5]]

可以看到,当修改原始对象的元素时,浅拷贝并不会影响新对象。但是当修改原始对象中的可变元素(例如列表)时,新对象会受到影响。

深拷贝(Deep Copy)

深拷贝是创建一个全新的对象,新对象与原对象的元素都是独立的。深拷贝会递归复制原对象及其所有嵌套对象。

在Python中,可以使用copy模块中的deepcopy方法进行深拷贝操作:

import copy

new_list = copy.deepcopy(old_list)
new_dict = copy.deepcopy(old_dict)
new_set = copy.deepcopy(old_set)
示例
import copy

old_list = [1, 2, 3, [4, 5]]
new_list = copy.deepcopy(old_list)  # 深拷贝

# 修改原始对象的元素
old_list[0] = 10
old_list[3][0] = 40

print(old_list)  # 输出 [10, 2, 3, [40, 5]]
print(new_list)  # 输出 [1, 2, 3, [4, 5]]

可以看到,深拷贝创建了一个全新的对象,修改原始对象的元素不会影响新对象。

比较浅拷贝和深拷贝

浅拷贝和深拷贝的区别在于复制的程度。浅拷贝只复制最外层对象本身,内部嵌套对象仍旧是原始对象内存中的引用,而深拷贝则递归复制了所有嵌套对象。因此,当修改原始对象中的可变元素时,浅拷贝会受到影响,而深拷贝不会。

示例
import copy

old_list = [1, 2, 3, [4, 5]]

# 浅拷贝
new_list_shallow = old_list[:]
# 深拷贝
new_list_deep = copy.deepcopy(old_list)

# 修改原始对象的元素
old_list[0] = 10
old_list[3][0] = 40

print(old_list)  # 输出 [10, 2, 3, [40, 5]]
print(new_list_shallow)  # 输出 [1, 2, 3, [40, 5]]
print(new_list_deep)  # 输出 [1, 2, 3, [4, 5]]

可以看到,浅拷贝在修改原始对象的可变元素时会受到影响,而深拷贝不会。

总结
  • 浅拷贝创建一个新对象,新对象中的元素是原始对象元素的引用;
  • 深拷贝创建一个全新的对象,新对象中的元素是独立的副本;
  • 修改原始对象中可变元素时,浅拷贝会受到影响,而深拷贝不会。

根据实际需求,选择适合的拷贝方式来操作对象,以确保代码的正确性和可维护性。