Python3的深拷贝与浅拷贝
题目
将一个列表的数据复制到另一个列表中。
做简单的题目就不应该局限于题目的解决,而要思考能拓展的内容,这个题目我想到的是拷贝机制
浅谈深拷贝浅拷贝和引用
容器多种不同方式的复制的区别,内容涉及浅拷贝和深拷贝
首先 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