Python 深拷贝与浅拷贝解析

本文介绍了Python中深浅拷贝的区别,重点在于修改拷贝数据对原数据的影响和拷贝后地址的变化。通过示例代码展示了`copy`模块的`deepcopy()`和切片、`.copy()`方法的使用,强调了在涉及多层列表时,浅拷贝修改第二层元素会同步原数据,而深拷贝则不会。同时,详细解释了不同拷贝方式下地址的变化规则。
摘要由CSDN通过智能技术生成

复习到了Python的深浅拷贝,在论坛上的博客看的云里雾里的(太菜了看不懂),索性自己整理的一下,水平有限,如有不足之处欢迎指出.

主要从修改拷贝数据对原数据的影响和拷贝后地址的变化两方面来说

import copy
ls1 = ['张轩','李岚','王晨',['周明','刘峰']]
ls2 = ls1#赋值,对象的引用 浅拷贝
ls3 = ls1[:]#切片是浅拷贝
ls4 = ls1.copy()#浅拷贝
ls5 = copy.deepcopy(ls1)#深拷贝
# 总结:浅拷贝修改第二层列表元素时原数据跟着变,深拷贝不变,修改第一层元素时,深浅拷贝的元数据都不会跟着变
#如果是ls2=ls1这样的对象引用,则一层数据的修改也会影响到原数据
#地址变化:
#可变是指与原数据的地址不同
#   浅拷贝一层若是可变数据类型,则两个地址不一样,是不可变数据类型地址一样
#   要是两层:一般都是外层可变,内层不变,如果是不可变数据类型则该层不变--->因为内层不变所以改变原列表,拷贝后的列表也跟着变
#   深拷贝一层如果是不可变数据类型就两个地址不变,是是可变数据类型就可变
#   深拷贝两层一半内外层地址都发生改变,如果是不可变数据类型则该层就不变---->因为内层地址可变,所以修改第二层列表元素的值时不会相互影响
# 赋值引用,就算是一层列表元素的改变也会相互关联
# print(id(ls1))#1519064713792
# print(id(ls2))#1519064713792
# print(id(ls3))#1519064714624
# print(id(ls4))#1519064714048
# print(id(ls5))#1519064822144
# ls2[2] = "Miku"
# print(ls1, ls2,sep="\n")
# ls3[0] = "Miku"
# print(ls1, ls3,sep="\n")
# ls4[0] = "Miku"
# print(ls1, ls4,sep="\n")
# ls4[3][0] = "Miku"   浅拷贝修改第二层列表元素时都变
# print(ls1, ls4,sep="\n")
# ls5[3][0] = "Miku"   深拷贝修改第二层列表元素时都不变
# print(ls1, ls5,sep="\n")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值