浅谈对深浅copy的个人理解(小白的理解,轻喷)
先讲个故事吧
一天,仓井老师给我们布置了作业,
第一题:做一个网站,网站主页内容是一张自己喜欢的老师的照片,把自己做的网站网址写在作业本上即可。
第二题:计算1+1=?把计算结果写在作业本上
聪明的我很快做完了作业,第一题,我的网站主页放了一张波多老师的照片,网址是www.boduo.com,第二题,我算的答案是1+1=3。
同桌二狗子很笨,他不会写作业,就原封不动地把我的作业给抄了,他第一题网址也是www.boduo.com,第二题答案也是3。
等他抄完,我发现第二题算错了,就把答案改成了2,二狗子这个笨蛋答案写的还是3。
过了一会,我看到了吉泽老师,感觉吉泽老师也很可爱,就把网站主页照片给换成了吉泽老师,当然二狗子作业里的网站主页也变成了吉泽老师的照片。
交上作业后,二狗子被苍井老师惩罚了一顿。
第二天,糊涂的苍井老师又布置了同样的作业。
我还想整一整二狗子,就把没改正的作业拿给他抄,没想到他学聪明了,第一题没有直接把我的网址写上去,写了自己的网站www.woshiergouzi.com。但是网站内容还是抄的我的波多老师照片。而第二题答案,他抄的还是1+1=3,哈哈哈哈……
我把1+1的答案改成了2,又为了讨好苍井老师,把网站里照片换成了她的。二狗子的网址用的自己的,所以他里面的照片还是波多老师的,而且他1+1的答案还是3,哈哈哈哈哈……
作业又交上去了,苍井老师直夸我作业写得好,还要我放学留下来领取奖励,而二狗子被留下打扫卫生。
故事讲的可能有些复杂,第一天就可以理解成二狗子浅copy了我的作业,第二天他深copy了我的作业。故事中的网址就好比python中的id。
首先我们要知道的是,如果两个相同列表或者字典的id相同,一个列表或字典改变时,另一个也随之改变,而两个相同数字,字符串,布尔值的id始终是一样的。
我们先看下浅copy:
list1 = [1, 2, 'aloha', [11, 22]]
list2 = list1.copy()
print(id(list1) == id(list2))
for i in range(4):
print(list1[i], id(list1[i]) == id(list2[i]))
#输出结果为:
'''
False
1 True
2 True
aloha True
[11, 22] True
'''
根据打印结果我们知道list1和list2的id是不同的,但是两个列表里面的数字,字符串和列表的id都是相同的。
而list1里面的1,2,‘aloha'是不可变的,[11, 22]是可变的。
因此,只要我们不修改[11, 22],不管对list1做任何修改,list2都不会改变。
如果修改了list1里面的[11, 22],那么list2里面的[11, 22]也会随之改变。
接着我们再看深copy:
import copy
list1 = [1, 2, 'aloha', [11, 22]]
list2 = copy.deepcopy(list1)
print(id(list1) == id(list2))
for i in range(4):
print(list1[i], id(list1[i]) == id(list2[i]))
# 输出结果为:
'''
False
1 True
2 True
aloha True
[11, 22] False
'''
根据打印结果可以看到,和浅copy唯一不同的是,list1和list2中的[11, 22]id是不一样的
因此,如果是深copy,即使改变list1中嵌套的[11, 22] (这是个列表,是可变的),但是list1和list2里面的[11, 22]他们的id不同,所以改变list1里面的[11, 22],list2不会改变。