当前位置: 移动技术网 > IT编程>脚本编程>Python > Python3的深拷贝与浅拷贝

Python3的深拷贝与浅拷贝

2020年08月01日  | 移动技术网IT编程  | 我要评论
Python快速上手练习题本期重点为对深拷贝和浅拷贝的理解,这部分内容在面向对象中较为重要。题目将一个列表的数据复制到另一个列表中。做简单的题目就不应该局限于题目的解决,而要思考能拓展的内容,这个题目我想到的是拷贝机制浅谈深拷贝浅拷贝和引用容器多种不同方式的复制的区别,内容涉及浅拷贝和深拷贝首先 b = a 的赋值形式,b只是作为a的一个引用,b会随着a的改变而改变,a也会随着b的改变而改变,和数字的赋值不同c = a[:]的形式,a[:]相当于一个返回了新列表的函数,c此时得到的资源是

题目

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

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

浅谈深拷贝浅拷贝和引用

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

首先 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']]]]						 深拷贝,任你万般变化,我自巍然不动 

本文地址:https://blog.csdn.net/qq_44869819/article/details/108294558

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网