Python练习题100例(部分题目多解)7 从零开始的python学习之路(第3期)讲人话的深拷贝与浅拷贝

时间:2020-8-31 作者:admin


Python快速上手练习题

本期重点为对深拷贝和浅拷贝的理解,这部分内容在面向对象中较为重要。

题目

将一个列表的数据复制到另一个列表中。

做简单的题目就不应该局限于题目的解决,而要思考能拓展的内容,这个题目我想到的是拷贝机制

浅谈深拷贝浅拷贝和引用

容器多种不同方式的复制的区别,内容涉及浅拷贝和深拷贝

首先 b = a 的赋值形式,b只是作为a的一个引用,b会随着a的改变而改变,a也会随着b的改变而改变,和数字的赋值不同

c = a[:]的形式,a[:]相当于一个返回了新列表的函数,c此时得到的资源是全新的资源,复制后完全不受a的影响

然后是两种copy方式,浅拷贝和深拷贝,这里如果不想深究可以记着:浅拷贝是浅层拷贝,只有第一层是独立的新空间(比如[1,2,3,[‘a’,‘b’]]中的1,2,3是第一层,而’a’,’b’在第二层)。其他的全是和原来的对象共用的,对于共用部分,也就是原来的对象变了,新对象也跟着变

(你懂了那你就在第五层了)

而深拷贝是完全拷贝,就算是老千层饼也能全拷贝过来

如果想深入理解建议学习指针,虽然python中一般不鼓励使用指针,但是稍微学习指针有助于理解

d = copy.copy(a) 浅拷贝,每个元素都是新的元素,值和原来相等,因此指针也是指向得同一块地址

e = copy.deepcopy(a) 深拷贝,每个元素也都是新的元素,但是涉及指针指向其他内容时,会创造新的空间

形象理解:

我有2幅画,1幅放在自己房间,1幅放在仓库(仓库的地址放在了房间里),现在有两个人想模仿我的画,但是他们只能看见我的房间,所以他们模仿的时候只能直接模仿我房间里的两幅画,并且先记住仓库的地址

其中一个人比较笨(浅拷贝),找不到仓库在哪。所以当别人问起他的画时(访问),他只能掏出直接模仿的那幅,以及仓库的地址,让问的人自己找去,所以只能找到我的仓库。

而另一个人比较聪明(深拷贝),找到了我的仓库,并且把其中的画临摹下来,放在了自己的仓库了,这样即使我改变了仓库里的画,聪明人依旧能掏出好看的画,是不是很客来碗呢?

还不理解可以直接看下面的例子

import copy

a = [1,2,3,['a','b',['a',['a']]]]
b = a                   #b只是引用a而已
c = a[:2]               #返回新列表
d = copy.copy(a)        #浅拷贝
e = copy.deepcopy(a)    #深拷贝

print("b[] =",b)
print("c[] =",c)
print("d[] =",d)
print("e[] =",e)

print("\n")
a.append(4)
print("b[] =",b)
print("c[] =",c)
print("d[] =",d)        #a的第一层对象变化时还不会影响d
print("e[] =",e)
print("\n")
a[3].append('c')
a[3][2][1].append('c')
print("b[] =",b)
print("c[] =",c)
print("d[] =",d)        #a的第二层元素变了d也就变了
print("e[] =",e)        #任你万般变化,我自巍然不动

对应输出

刚开始的内容
b[] = [1, 2, 3, ['a', 'b', ['a', ['a']]]]
c[] = [1, 2]
d[] = [1, 2, 3, ['a', 'b', ['a', ['a']]]]
e[] = [1, 2, 3, ['a', 'b', ['a', ['a']]]]

在第一层添加了一个4(对浅层元素的改动)
b[] = [1, 2, 3, ['a', 'b', ['a', ['a']]], 4]
c[] = [1, 2]
d[] = [1, 2, 3, ['a', 'b', ['a', ['a']]]]			a的第一层对象变化时还不会影响d
e[] = [1, 2, 3, ['a', 'b', ['a', ['a']]]]


b[] = [1, 2, 3, ['a', 'b', ['a', ['a', 'c']], 'c'], 4]
c[] = [1, 2]
d[] = [1, 2, 3, ['a', 'b', ['a', ['a', 'c']], 'c']]				 a的第二层元素变了d也就变了
e[] = [1, 2, 3, ['a', 'b', ['a', ['a']]]]						 深拷贝,任你万般变化,我自巍然不动

欢迎大家指出错误,觉得本期内容让你初步理解了拷贝机制就点个赞吧!

Python练习题100例(部分题目多解)7 从零开始的python学习之路(第3期)讲人话的深拷贝与浅拷贝

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。