在 Python 中,变量赋值、浅拷贝和深拷贝在处理对象时有不同的行为和应用场景。以下是它们的详细区别:
1. 赋值
赋值操作只是创建了一个新的引用(别名)来指向同一个对象。也就是说,赋值操作并不创建新的对象,原始对象和赋值后的变量指向同一块内存区域。
a = [1, 2, 3]
b = a # b 是 a 的引用
b[0] = 99
print("a:", a) # 输出: [99, 2, 3]
print("b:", b) # 输出: [99, 2, 3]
如上所示,修改 b
的内容也会影响到 a
,因为它们指向同一个对象。
2. 浅拷贝
浅拷贝创建了一个新的对象,但并不递归地复制子对象。新的对象包含了对原始对象中子对象的引用,因此修改新对象的子对象也会影响到原始对象。
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a) # 创建 a 的浅拷贝
b[2][0] = 99
print("a:", a) # 输出: [1, 2, [99, 4]]
print("b:", b) # 输出: [1, 2, [99, 4]]
如上所示,修改 b
的子对象也会影响到 a
,因为浅拷贝只是复制了对子对象的引用。
3. 深拷贝
深拷贝创建了一个新的对象,并且递归地复制所有的子对象。新对象和原始对象完全独立,修改新对象不会影响到原始对象。
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a) # 创建 a 的深拷贝
b[2][0] = 99
print("a:", a) # 输出: [1, 2, [3, 4]]
print("b:", b) # 输出: [1, 2, [99, 4]]
如上所示,修改 b
的子对象不会影响到 a
,因为深拷贝创建了完全独立的对象。
总结
- 赋值:创建一个新的引用,原始对象和新变量指向同一个对象。
- 浅拷贝:创建一个新的对象,但只复制了对象的顶层,子对象仍然是原始对象的引用。
- 深拷贝:创建一个新的对象,并递归地复制所有子对象,新对象和原始对象完全独立。