Python中浅拷贝与深拷贝的操作

【例子】浅拷贝与深拷贝中list1 = [123, 456, 789, 213]list2 = list1list3 = list1[:]print(list2) # [123, 456, 789, 213]print(list3) # [123, 456, 789, 213]list1.sort()print(list2) # [123, 213, 456, 789] **print(list3) # [123, 456, 789, 213]**list1 = [[123, 456], [789, 213]]list2 = list1list3 = list1[:]print(list2) # [[123, 456], [789, 213]]print(list3) # [[123, 456], [789, 213]]list1[0][0] = 111print(list2) # [[111, 456], [789, 213]]**print(list3) # [[111, 456], [789, 213]]小朋友,你是否有很多问号?????
为什么同样是list3 = list1[:]
执行list1.sort() 操作,list3不发生变化
执行list1[0][0] = 111 操作,list3发生变化
首先我们先了解到python的拷贝有浅拷贝和深拷贝之分
序号操作语句拷贝类型
1 y= x 直接赋值(浅拷贝)
2 z = x [:] 浅拷贝
3 p = copy.coppy(x) 浅拷贝
4 k = copy.deepcopy(x) 深拷贝
接下来我们来探索一下,这些个浅拷贝和深拷贝具体细节上有什么区别呢?
看看这个caseimport copyx = [1,3,5,['我','是','第','二','维','度'],9,11]y= x # 直接赋值(浅拷贝)z = x [:] # 浅拷贝 p = copy.copy(x) # 浅拷贝 k = copy.deepcopy(x)# 深拷贝 #现在我们在x数组的第三个值里面添加一个'哈哈',把里面的是改为不是x[3].append('哈哈')x[3][1] = '不是'#我们打印一下结果瞧一瞧print(起始列表x为 : , x)print(把x列表赋值给y为 : , y)print(浅拷贝x列表给z为 : , z)print(浅拷贝x列表给p为 : , p)print(深拷贝x列表给k为 : , k)输出结果为:起始列表x为 : [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]把x列表赋值给y为 : [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]浅拷贝x列表给z为 : [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]浅拷贝x列表给p为 : [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]深拷贝x列表给k为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]是不是发现深拷贝与浅拷贝的一点点区别啦 ^ . ^只有深拷贝不被更改**!!!**
辣么,我现在想要把x列表的第三值 ['我','是','第','二','维','度'] 改为 7,把最后一个值改为101,看看这些个浅拷贝和深拷贝又是怎么表现的......
import copyx = [1,3,5,['我','是','第','二','维','度'],9,11]y= x # 直接赋值(浅拷贝)z = x [:] # 浅拷贝 p = copy.copy(x) # 浅拷贝 k = copy.deepcopy(x)# 深拷贝现在我们修改x数组的第三个值,把最后一个值改为101
x[3] = 7x[-1] = 101我们打印一下结果瞧一瞧
print(起始列表x为 : , x)print(把x列表赋值给y为 : , y)print(浅拷贝x列表给z为 : , z)print(浅拷贝x列表给p为 : , p)print(深拷贝x列表给k为 : , k)输出结果为:起始列表x为 : [1, 3, 5, 7, 9, 101] 把x列表赋值给y为 : [1, 3, 5, 7, 9, 101] 浅拷贝x列表给z为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11] 浅拷贝x列表给p为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11] 深拷贝x列表给k为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]咦!?发现了什么 ~. ~有的浅拷贝背叛了同胞 ! 和深拷贝的表现是一样的
结合上面的例子,我们发现,对二维列表中的第一维数据做修改时,使用 = 进行赋值,对x的修改会影响y,使用 [:] , copy.copy() , copy.deepcopy() 进行赋值,对x的修改不会影响新的赋值。
如果是对二维列表中的第一维数据做增加或者删除操作呢?试一试咯
import copyx = [1,3,5,['我','是','第','二','维','度'],9,11]y= x # 直接赋值(浅拷贝)z = x [:]# 浅拷贝 p = copy.copy(x) # 浅拷贝 k = copy.deepcopy(x)# 深拷贝 #在x数组最后添加13,删除第0个值x.append(13)x.remove(1)#我们打印一下结果瞧一瞧print(起始列表x为 : , x)print(把x列表赋值给y为 : , y)print(浅拷贝x列表给z为 : , z)print(浅拷贝x列表给p为 : , p)print(深拷贝x列表给k为 : , k)输出结果为:起始列表x为 : [3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11, 13] 把x列表赋值给y为 : [3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11, 13] 浅拷贝x列表给z为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11] 浅拷贝x列表给p为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11] 深拷贝x列表给k为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]我们发现,对二维列表中的第一维数据做增加或者删除操作
同样是只有使用 = 进行赋值,对x的修改会影响y
于是乎,我们可以把上面的 修改 扩充为 增删改 (改也就包括了排序sort()操作哟)
即对二维列表中的第一维数据做 增删改 操作时,blabla......
你以为这就结束了吗?我,第二维数据不想被修改,也不想用深拷贝,怎么办?
别急,append和 [:] 组合服用就能够达到深拷贝deepcopy的效果啦 ===>看
x = [['我','几','维','度'],['我','是','第','二','维','度'],['我','不','说']]y= x # 直接赋值(浅拷贝)z = x [:] # 浅拷贝 p = copy.copy(x) # 浅拷贝 k = copy.deepcopy(x) # 深拷贝 tt = []for i in x: tt.append(i[:]) # 我是骚操作#修改第二维度信息x[1].append('哈哈')x[1][1] = '不是'#我们打印一下结果瞧一瞧print(起始列表x为 : , x)print(把x列表赋值给y为 : , y)print(浅拷贝x列表给z为 : , z)print(浅拷贝x列表给p为 : , p)print(深拷贝x列表给k为 : , k)print(骚操作x列表给tt为 : , tt)输出结果为:起始列表x为 : [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]把x列表赋值给y为 : [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]浅拷贝x列表给z为 : [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]浅拷贝x列表给p为 : [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]深拷贝x列表给k为 : **[['我', '几', '维', '度'], ['我', '是', '第', '二', '维', '度'], ['我', '不', '说']]骚操作x列表给tt为 : **[['我', '几', '维', '度'], ['我', '是', '第', '二', '维', '度'], ['我',

你真的会用直流电源给电池充电吗?(上)
电子膨胀阀故障判断
5 SXT 的高性能 DSP 解决方案
电感和电容对交变电流的影响
半导体点温计的使用方法_半导体点温计使用注意事项
Python中浅拷贝与深拷贝的操作
TTL逆变器和NAND门
专业嵌入二维码扫描头LV30,兼容各类极小型化的应用设备
CS1242IC模块:寄存器ACR控制 有效提高输入阻抗
计算机通过监视人脑信号来模拟视觉感知
三菱PLC的汇点式、分组式、分割式接线方式
国产32位MCU芯片CS32F030系列介绍
VMware虚拟机配置文件丢失的数据恢复案例
传印度即将与特斯拉达成协议 允许进口电动汽车并设立工厂
简单聊一下用来反转电压的inverting converter
NVIDIA GTX 1080 Ti核心揭秘:拆解对比TITAN X
定华G80调频雷达物位计优势
微流体的关键概念和应用分析
电易云-智慧电力运维系统,实时监测配电柜运行状态
基于SPI接口提高通道密度的解决方案