在 Python 中,对象的拷贝方式主要有三种:浅拷贝(shallow copy)、深拷贝(deep copy)、以及直接赋值。每种方式的行为有所不同,特别是在处理嵌套对象时。
1. 直接赋值
直接赋值并不会拷贝对象,而是创建一个新的引用,指向同一个对象。因此,改变对象的内容会影响所有引用。
# 直接赋值
a = [1, 2, 3]
b = a # b 是 a 的引用
b[0] = 99
print(a) # 输出: [99, 2, 3]
print(b) # 输出: [99, 2, 3]
2. 浅拷贝(shallow copy)
浅拷贝会创建一个新的对象,但只复制顶层对象,不会递归复制嵌套的对象。因此,嵌套对象仍然是原始对象的引用。
方法1:使用 copy
模块中的 copy()
函数
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a) # 浅拷贝
b[0] = 99
b[2][0] = 100
print(a) # 输出: [1, 2, [100, 4]]
print(b) # 输出: [99, 2, [100, 4]]
方法2:使用列表的 copy()
方法(仅适用于列表)
a = [1, 2, [3, 4]]
b = a.copy() # 浅拷贝
b[0] = 99
b[2][0] = 100
print(a) # 输出: [1, 2, [100, 4]]
print(b) # 输出: [99, 2, [100, 4]]
3. 深拷贝(deep copy)
深拷贝会递归地复制对象以及其包含的所有嵌套对象,创建一个完全独立的副本。修改深拷贝后的对象不会影响原对象。
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a) # 深拷贝
b[0] = 99
b[2][0] = 100
print(a) # 输出: [1, 2, [3, 4]]
print(b) # 输出: [99, 2, [100, 4]]
4. 总结
- 直接赋值:创建引用,所有引用指向同一个对象。
- 浅拷贝:复制顶层对象,不复制嵌套对象,嵌套对象仍然是原始对象的引用。
- 深拷贝:递归地复制对象及其嵌套对象,创建一个完全独立的副本。
这三种方法各有其适用场景,选择哪种取决于对象的复杂性和是否需要完全独立的副本。