python---赋值、浅拷贝、深拷贝
文章目录
- 1. 赋值 (=)
- 赋值的特点:
- 2. 浅拷贝 (copy(),Shallow Copy)
- 底层原理
- 创造浅拷贝的方法
- 3. 深拷贝 (deepcopy(),Deep Copy)
- 底层原理
- 深拷贝的特点:
- 拷贝方式的使用场景
- 综合示例
- 相关文章推荐
在Python中,理解赋值、浅拷贝和深拷贝的区别对于避免意外的数据修改非常重要。
1. 赋值 (=)
赋值操作只是创建了一个新的引用,指向同一个对象。
a = [1, 2, [3, 4]]
b = a # 赋值操作a[0] = 10
print(b) # 输出: [10, 2, [3, 4]] - b也跟着改变了
赋值的特点:
1、新变量和原变量指向同一个内存地址
2、修改其中一个会影响另一个
3、对于可变对象(列表、字典等)尤其需要注意
2. 浅拷贝 (copy(),Shallow Copy)
浅拷贝会创建一个新对象(顶层容器),但嵌套对象(子对象)的引用保持不变。新对象与原对象共享子对象的内存地址。修改子对象的值会影响原对象,但修改顶层容器的引用不会影响原对象。简单来说,浅拷贝会创建一个新对象,但只拷贝第一层内容,对于嵌套的对象仍然使用引用。
import copya = [1, 2, [3, 4]]
b = copy.copy(a) # 浅拷贝a[0] = 10
print(b) # 输出: [1, 2, [3, 4]] - b的第一层不受影响a[2][0] = 30
print(b) # 输出: [1, 2, [30, 4]] - 嵌套列表被修改了
底层原理
1、浅拷贝仅复制顶层容器的结构,不会递归复制子对象。
2、新对象的每个元素是原对象元素的引用(即指向相同的内存地址)。
创造浅拷贝的方法
1、copy.copy()
2、列表的切片操作 list[:]
3、字典的 dict.copy() 方法
4、集合的 set.copy() 方法
5、构造函数
3. 深拷贝 (deepcopy(),Deep Copy)
深拷贝会创建一个完全独立的新对象,递归复制所有嵌套对象,确保新对象与原对象及其子对象无任何引用关系。修改新对象的任何层级都不会影响原对象。简单来说,深拷贝会递归地拷贝所有嵌套对象,创建一个完全独立的新对象。
底层原理
1、通过递归遍历原对象的所有层级,逐层复制每个子对象,生成全新的内存地址。
2、对于不可变对象(如整数、字符串),深拷贝可能直接引用原值(因为不可变对象无法修改)。
3、对于可变对象(如列表、字典),深拷贝会逐层复制,确保完全独立。
import copya = [1, 2, [3, 4]]
b = copy.deepcopy(a) # 深拷贝a[0] = 10
a[2][0] = 30
print(b) # 输出: [1, 2, [3, 4]] - b完全不受影响
深拷贝的特点:
1、创建完全独立的对象副本
2、修改原对象不会影响拷贝后的对象
3、对于嵌套结构特别有用
4、性能开销比浅拷贝大
拷贝方式的使用场景
1、赋值:当你确实需要共享同一个对象时
2、浅拷贝:当对象没有嵌套结构或你确实需要共享嵌套对象时
3、深拷贝:当需要完全独立的副本,特别是对象包含嵌套结构时
综合示例
import copyoriginal = [1, [2, 3], {'a': 4}]# 赋值
assigned = original# 浅拷贝
shallow_copied = copy.copy(original)# 深拷贝
deep_copied = copy.deepcopy(original)# 修改原始对象
original[0] = 10
original[1][0] = 20
original[2]['a'] = 40print("赋值后的:", assigned) # 完全跟随变化
print("浅拷贝的:", shallow_copied) # 第一层不变,嵌套对象变化
print("深拷贝的:", deep_copied) # 完全不变
输出结果:
赋值后的: [10, [20, 3], {'a': 40}]
浅拷贝的: [1, [20, 3], {'a': 40}]
深拷贝的: [1, [2, 3], {'a': 4}]
相关文章推荐
相关文章1