• 浅谈对深浅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不会改变。

  • 相关阅读:
    c语言之排序
    c语言中的break 和 continue语句
    c语言之循环
    c语言之选择
    使用函数封装代码
    C语言的运算符
    判断两个对象是否相等:hashcode
    更新线上的资源存在删除和添加的情况-要避免空窗期的实现方法
    变量只能设置一次方法
    JAVA-获取系统信息:内存和系统、PID、内核
  • 原文地址:https://www.cnblogs.com/west-yang/p/12556559.html
Copyright © 2020-2023  润新知