zoukankan      html  css  js  c++  java
  • 深浅拷贝

    copy就是复制一份,也就是所谓的抄一份.深浅拷贝其实就是完全复制一份,和部分复制一份的意思.

    1. 先看看赋值运算

    l1 = [1,2,3,['jason', 'egon']]
    l2 = l1
    
    l1[0] = 111
    print(l1)
    print(l2)
    
     # [111, 2, 3, ['jason', 'egon']]
    #  [111, 2, 3, ['jason', 'egon']]
    
    l1[3][0] = 'kevin'
    print(l1)  # [111, 2, 3, ['kevin', 'egon']]
    print(l2)  # [111, 2, 3, ['kevin', 'egon']]
    

      对于赋值运算来说,l1和l2指向的是同一个地址,所以他们是完全一样的,再举个例子,比如张三李四合租在一起,那么对客厅来说,他们是公用的,张三可以用, 李四可以用,但有一天张三把客厅的电视换成投影了,那么李四想在客厅看电视,而电视没有了,而是投影,l1,l2指向的是同一张表,任何一个变量对列表进行修改,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表.

    2. 深浅拷贝

    浅拷贝: 在内存中只额外创建第一层数据

    import copy
    >>> n1 = {'k1':'v1','k2':'v2','k3':['liuyao','job']}
    >>> n2 = copy.copy(n1)
    >>> id(n1)
    140120750337544
    >>> id(n2)
    140120750371208
    >>> id(n1['k3'][0])
    140120778934064
    >>> id(n2['k3'][0])
    140120778934064

      

    深拷贝: 在内存中将所有的数据重新创建一份(排除最后一层,python内部对字符串和数字的优化)

    >>> import copy
    >>> n1 = {'k1':'v1','k2':'v2','k3':['liuyao','job']}
    >>> n2 = copy.deepcopy(n1)
    >>> id(n1)
    140120750514696
    >>> id(n2)
    140120750514888
    >>> id(n1['k3'])
    140120750335688
    >>> id(n2['k3'])
    140120750335752
    >>> id(n2['k3'][0])
    140120778934064
    >>> id(n1['k3'][0])
    140120778934064
    

      

     综上分析,深浅拷贝其实就是可变类型与不可变类型之间的区分,不可变类型(数字、字符串、元组)在浅拷贝时值不会发生变化,可变类型(列表、字典)值发生变化时,浅拷贝时也跟着变化,在深拷贝时,不可变类型发生变化,深拷贝的对象不会发生变化,可变类型变化时,也不会发生变化.

    生前无需久睡,死后自会长眠,努力解决生活中遇到的各种问题,不畏将来,勇敢面对,加油,你是最胖的,哈哈哈
  • 相关阅读:
    排序函数
    Wooden Sticks
    Tian Ji -- The Horse Racing
    error
    Java学习笔记七——数组工具类Arrays
    java学习笔记六——数组
    Java学习笔记五——流程控制
    Java学习笔记四——运算符
    Java学习笔记三——数据类型
    Java学习笔记二——标识符和关键字
  • 原文地址:https://www.cnblogs.com/panshao51km-cn/p/11546502.html
Copyright © 2011-2022 走看看