千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > python的深浅拷贝

python的深浅拷贝

来源:千锋教育
发布人:xqq
时间: 2023-11-06 20:35:06 1699274106

1.python中,对象赋值实际是对对象的引用,比如:

alist=[1,2,[1,2,3]]

b=alist

其中,b就是直接引用**ist指向的对象,也就是内存中heap中的一个值,以后这个值发生了什么变化,b和alist就跟着变化

2.浅拷贝--copy,直接看例子:可以看到,浅拷贝只拷贝父对象,不会拷贝对象内部的子对象。我不是很理解这句话,其实就是浅拷贝如果

里面是具体的值,则拷贝的对象不会变化,如果是拷贝的是堆对象,则跟着堆对象的变化而变化?

l=[1,2,[1,2,3]]

>>>m=copy.copy(l)

>>>m

[1,2,[1,2,3]]

>>>l[2].append(4)

>>>l

[1,2,[1,2,3,4]]

>>>m

[1,2,[1,2,3,4]]

>>>l[0]=100

>>>l

[100,2,[1,2,3,4]]

>>>m

[1,2,[1,2,3,4]]

现在依次把m,l中的值地址打印出来:

[id(x)forxinm]

[35289464L,35289440L,55546952L]

>>>[id(x)forxinl]

[35291072L,35289440L,55546952L]

可以看到末端的列表元素指向的是同一个地址,所以这个地址里的东西发生变化了,就都会变化呀

再举一例:

>>>l=[1,2,{'age':90}]

>>>l

[1,2,{'age':90}]

>>>m=copy.copy(l)

>>>m

[1,2,{'age':90}]

>>>[id(x)forxinl]

[35289464L,35289440L,55566680L]

>>>[id(x)forxinm]

[35289464L,35289440L,55566680L]

>>>l[2]=[1,2]

>>>l

[1,2,[1,2]]

>>>m

[1,2,{'age':90}]

>>>[id(x)forxinl]

[35289464L,35289440L,55548552L]

3.深拷贝:直接就是拷贝了对象本身,即堆内存中的那一坨,那你原来那一坨的改变就不能影响深拷贝的元素的变化了

>>>mimi=['mimi',['age',30]]

>>>kiki=copy.deepcopy(mimi)

>>>bibi=copy.deepcopy(mimi)

>>>printid(mimi),id(kiki),id(bibi)

555754965554733655546248

>>>kiki

['mimi',['age',30]]

>>>bibi

['mimi',['age',30]]

>>>kiki[0]='kiki'

>>>bibi[0]='bibi'

>>>printmimi,kiki,bibi

['mimi',['age',30]]['kiki',['age',30]]['bibi',['age',30]]

>>>kiki[1][1]=31

>>>kiki

['kiki',['age',31]]

>>>bibi[1][1]=32

>>>printmimi,kiki,bibi

['mimi',['age',30]]['kiki',['age',31]]['bibi',['age',32]]

>>>[id(x)forxinmimi]

[53922472L,55631304L]

>>>[id(x)forxinmimi]

[53922472L,55631304L]

>>>[id(x)forxinkiki]

[56337952L,55546760L]

>>>[id(x)forxinbibi]

[53923752L,55600264L]

从例子看出,深拷贝就不会列表中的列表发生一起改变的事情,

总结一下:

1.利用切片和工厂方法,copy方法进行的拷贝都是浅拷贝,就是拷贝的是原有对象的地址,在这个地址上发生的改变之后都被记下来,

切片复制:

p=[1,2,3]

t=p[:]

工厂方法:

t=list(p)

copy方法:

t=copy.copy(p)

2.利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。就是把所有的值复制了一遍,

原有地址的变化和拷贝发生后的对象毫无关联

注意的是:对于数字,字符串,其他原子类型的对象来说,没有拷贝的说法,原子类型对象:个人感觉就是存放在栈中的对象,顾名思义

就是不可再分割,或是组成其它数据类型的元元素。python来说就是数字,字符串

以上内容为大家介绍了python的深浅拷贝,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/

tags: python培训
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT