python copy.deepcopy / copy.copy / '=' 的区别

本文深入探讨了Python中深拷贝与浅拷贝的区别,解释了它们如何处理简单类型、复杂对象以及对象间的引用关系。通过具体示例,展示了不同拷贝方式下对象属性变化的影响。

对于不可变对象a(int,str, tuple, None等):

deepcopy复制原来地址,内容不随a的变化而变

copy 复制原来地址,内容不随a的变化而变

‘=’复制原来地址,内容不随a的变化而变

对于可变对象b(list, dict,set等):

deepcopy新建地址,内容不随a的变化而变

copy 新建地址,内容不随a的变化而变

‘=’复制原来地址,内容随a的变化而变

而对于复杂对象(对象中有其他引用),copy 和 deepcopy则有所不同:

copy浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制

deepcopy深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制

import copy
val1 = [1, 2, [3, 4]]
# val1 = {'a':1}
# val1 = 1
val2 = copy.copy(val1)
val3 = val1
val4 = copy.deepcopy(val1)
print(val1,val2,val3, val4)
print(id(val1),id(val2),id(val3),id(val4))
val1[2][0] = "hey!"
# val1['a']+=1
# val1+=1
print(val1,val2,val3, val4)
print(id(val1),id(val2),id(val3),id(val4))

输出:

[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]]
1708571782408 1708571694664 1708571782408 1708571135560
[1, 2, ['hey!', 4]] [1, 2, ['hey!', 4]] [1, 2, ['hey!', 4]] [1, 2, [3, 4]]
1708571782408 1708571694664 1708571782408 1708571135560

此时copy虽然新建地址,但是引用内容也随之变化,而deepcopy则完完整整保持不变

所以应用中一定要使用deepcopy哟

### Python `copy.deepcopy` 函数的性能分析 #### 深拷贝机制概述 深拷贝操作会创建一个新的复合对象,并递归地将原始对象中的所有子对象复制到新对象中。这意味着如果源数据结构非常复杂或庞大,那么深拷贝将会消耗更多的时间内存资源。 #### 性能影响因素 - **嵌套层次**:当处理多层嵌套的数据结构时(如二维列表或多级字典),由于每次都需要深入一层来完成完整的副本创建过程,因此随着层数增加,所需时间也会相应增长[^1]。 - **元素数量**:被复制的对象内含有的元素越多,则整个复制过程中涉及的操作次数就越高,从而导致更慢的速度表现。 - **不可变对象 vs 可变对象**:对于字符串、元组这类不可变得内置类型,在进行深拷贝时不必要真正克隆它们;而对于像列表这样的可变容器则需逐项重建其内部成员关系链表。 #### 实验测试代码示例 下面通过一段简单的实验脚本来展示不同规模下的效率差异: ```python import timeit from copy import deepcopy def test_deep_copy_performance(size): original_data = [[i * j for j in range(10)] for i in range(size)] start_time = timeit.default_timer() _ = deepcopy(original_data) end_time = timeit.default_timer() elapsed_seconds = (end_time - start_time)*1e6 print(f"Deep copying a {size}x{len(original_data[0])} matrix took {elapsed_seconds:.2f} microseconds.") if __name__ == "__main__": sizes_to_test = [10, 100, 500, 1000] for size in sizes_to_test: test_deep_copy_performance(size) ``` 此段程序定义了一个名为 `test_deep_copy_performance()` 的辅助函数用于测量给定大小矩阵执行一次深拷贝所花费的具体耗时时长,并打印出来供观察者直观感受变化趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值