Python中浅拷贝和深拷贝的区别

浅拷贝和深拷贝的概念

浅拷贝:

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

深拷贝:

深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。深拷贝相比于浅拷贝速度较慢并且花销较大。

在python中

浅拷贝(copy()):拷贝父对象,不会拷贝对象内部的子对象。

深拷贝(deepcopy()):完全拷贝了子对象和父对象。

import copy

list01 = [1, [10, 20]]
list02 = list01[:]
list03 = copy.deepcopy(list01)

list02[1][0] = 100
list02[0] = 2
print(list01)
print(list02)
print(list03)

 总结

浅拷贝只是复制了对象的引用,并不是复制对象本身,和原对象共用内存,而深拷贝会生成一个新对象,与原对象互不影响。

### Python浅拷贝深拷贝区别Python 编程语言中,对象可以通过两种方式复制:浅拷贝(shallow copy)深拷贝(deep copy)。这两种方法的主要差异在于如何处理复杂结构中的嵌套对象。 #### 浅拷贝行为 对于简单数据类型如整数、字符串等不可变对象,赋值操作实际上就是创建了一个新变量指向同一个值。然而,在涉及复合数据类型比如列表或字典时情况有所不同: - 当执行浅拷贝操作时,只会复制顶层容器本身而不会递归地复制其内部元素; - 如果这些内部元素是可变对象,则原对象及其副本之间共享相同的子对象引用;这意味着修改其中一个对象内的任何可变组件会影响到另一个对象[^1]。 ```python import copy original_list = ['a', ['b', 'c'], 'd'] shallow_copied_list = original_list.copy() # 使用 .copy() 方法实现浅拷贝 print(shallow_copied_list[1] is original_list[1]) # True 表明两个列表共享同一子列表实例 ``` #### 深拷贝特性 相比之下,深拷贝不仅会创建一个新的顶级容器来容纳被复制的内容,还会递归地遍历整个层次结构并为每一个遇到的可变对象建立全新实例。因此,通过这种方式得到的新对象与其原型完全分离,互不影响[^2]。 ```python import copy original_dict = { "key": ["value", {"nested_key": "nested_value"}], } deep_copied_dict = copy.deepcopy(original_dict) # 修改原始字典中的嵌套部分 original_dict["key"][1]["nested_key"] = "changed_nested_value" print(deep_copied_dict["key"][1]["nested_key"]) # 输出: nested_value (未受影响) ``` #### 性能考量 值得注意的是,虽然深拷贝提供了更安全的操作模式——尤其是在多线程环境中或是当需要确保数据一致性的情况下非常有用——但它通常比浅拷贝消耗更多的时间资源。这是因为每次调用 `deepcopy()` 函数都要额外花费时间去构建完整的对象树副本[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值