import copy
a = [[1.2,3],[4,5,6]]
b= a
c= copy.copy(a)
d = copy.deepcopy(a)
a.append(7)
a[1][2]=0
print("原列表:",a)
print("引用赋值:",b)
print("浅拷贝:",c)
print("深拷贝:",d)
一、场景
当我们面试关于python语法的时候,面试官会出一些我们很难注意到的问题,比如上面的代码段.
我们可能出现了很多种回答,究竟答案是哪个样子呢?不烦可以自己试试!
二、答案
答案是这样的:
原列表:[[1,2,3],[4,5,0],7]
引用赋值:[[1,2,3],[4,5,0],7]
浅拷贝:[[1,2,3],[4,5,0]]
深拷贝:[[1,2,3],[4,5,6]]
三、趣话说拷贝
这里我们梳理一下三个概念:引用赋值、浅拷贝、深拷贝
(1)引用赋值
引用赋值 b=a ,等于a这个对象起了一个别名,b和a 指向了同一个东西,不管是对a进行修改还是对b进行修改,实际上修改的还是同一个东西。
就好比,王小明他有一个别名叫“王百万”,那王小明和王百万都是同一个人。
(2)浅拷贝
浅拷贝对于列表,实际上拷贝出来的是原先的对象每个值的内存地址,然后死盯着一亩三分地其他不管。
王小明家三年前家里种了两亩地,一亩种的西瓜,一亩种的玉米。
浅拷贝隔壁老李就是记住了这两亩地,就看着这两亩地,王小明今年两亩地都开上中西瓜,那浅拷贝老李每天都盯着这两亩地那肯定是很了解这个变化的。至于王小明又在隔壁村承包了一亩地种番茄,浅拷贝隔壁老李并不知道。
(3)深拷贝
深拷贝,对于列表,他是一次性记忆,将变量当时的状态和值直接拷贝过来,从此与原变量无关,完全独立了。
深拷贝小张记得以前王小明家是在种西瓜奔小康,于是深拷贝小张也学王小明学种西瓜,多年以后王小明开上了劳斯莱斯,深拷贝小张一脸懵逼,他还以为小明是那个农民,实际上这么多年没联系,王小明家的两亩地被征收做房地产了。
以上是本人的理解,不知道是否总结到位。
欢迎一起探讨,个人微信ai_hellohello