Python扩展_浅拷贝和深拷贝

本文深入探讨了Python中列表的浅拷贝和深拷贝的区别,通过实例解析了它们在内存地址、内容修改上的差异,并介绍了`copy`模块的`deepcopy()`方法。理解这些概念对于避免意外的数据修改至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

num1 = [1, 2, 3]
num2 = num1     # 将num1的地址值复制给了num2
num1.append(4)
num2.append(5)  # 无论num1或num2谁添加,都是一个内容(存储的地址内容)改变
print(num1, id(num1))
print(num2, id(num2)) #id看地址相同

憨憨画图
num2 = num1
把num1堆内存的地址给了num2,num1和num2指定储存地址内容是相同的,无论谁改变新的内容,都是在同一个堆内存改变新的值,所以改变内容相同,id相同。

输出为:
[1, 2, 3, 4, 5] 1407260545856
[1, 2, 3, 4, 5] 1407260545856
# 浅copy  只copy列表的一级元素,复制了嵌套的可变数据类型的地址
num1 = [1, [2, 3]]
num2 = num1.copy()
print(num1, id(num1))
print(num2, id(num2))
num1.append(4)
num2.append(5)
num1[1].append(6)
print(num1, id(num1))
print(num2, id(num2))
print("num1[0]:", num1[0], id(num1[0]))
print("num2[0]:", num2[0], id(num2[0]))
print("num1[1]:", num1[1], id(num1[1]))
print("num2[1]:", num2[1], id(num2[1]))

憨憨图片
num2 = num1.copy() 只能复制一级地址。num1和num2的堆地址不同,所以id不同,在一级地址内增加的内容,根据不同增加的内容,各自增加各自的。但是如果不是一级地址,比如增在[2,3],这不是一级地址了,他们的的堆地址是相同的,所以会一起改变,内容发生改变。

输出为:
[1, [2, 3]] 2422347255616
[1, [2, 3]] 2422347256064
[1, [2, 3, 6], 4] 2422347255616
[1, [2, 3, 6], 5] 2422347256064
num1[0]: 1 140705941997216
num2[0]: 1 140705941997216
num1[1]: [2, 3, 6] 2422347256640
num2[1]: [2, 3, 6] 2422347256640
# 深拷贝 能够copy列表所有层次的元素,复制了嵌套的可变数据类型元素
import copy
num1 = [1, [2, 3]]
num2 = copy.deepcopy(num1)
num1.append(4)
num2.append(5)
num1[1].append(6)
print(num1, id(num1))
print(num2, id(num2))
print("num1[0]:", num1[0], id(num1[0]))
print("num2[0]:", num2[0], id(num2[0]))
print("num1[1]:", num1[1], id(num1[1]))
print("num2[1]:", num2[1], id(num2[1]))

憨憨
num2 = num1.deepcopy 复制了所有层次的元素,除了最终得内存地址(元素的储存地址)相同,其他的内存地址都不相同,所以各自更改,互不影响。

输出为:
[1, [2, 3, 6], 4] 1657409099136
[1, [2, 3], 5] 1657409073984
num1[0]: 1 140705941997216
num2[0]: 1 140705941997216
num1[1]: [2, 3, 6] 1657409098880
num2[1]: [2, 3] 1657409099456
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值