zoukankan      html  css  js  c++  java
  • 第五篇python进阶之深浅拷贝

    第五篇python进阶之深浅拷贝

    一、引言

    1.1可变 和不可变

    id不变 值可以变 即为可变数据类型;值变id也变,即为不可变数据类型

    age = 19
    print(f'first:{id(age)}')
    age = 20
    print(f'second:{id(age)}')
    
    first:4384901776
    second:4384901808
    

    二、拷贝(只针对可变数据类型)

    如果l2是l1的拷贝对象,则l1内的任何数据类型的元素发生变化,l2内部也会相应的改变

    l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
    l2 = l1
    
    l1.append('g')
    
    print(l1)
    
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    
    print(l2)
    
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    

    个人觉得l1和l2共享着同一个列表,所以l1和l2不管谁修改了列表,都会改变列表的值

    三、浅拷贝

    如果l2是l1的拷贝对象,则l1内部的不可变数据类型的元素变化,则l2内部的元素不会改变;l1的可变元素发生变化,则l2对应的可变元素也跟着改变

     import copy
     l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
     l2 = copy.copy(l1)
     l1.append('g')
     print(l1)
    
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    print(l2)
    
    ['a', 'b', 'c', ['d', 'e', 'f']]
    
    l1[3].append('g')
    
    print(l1)
    
    ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
    
    print(l2)
    
    ['a', 'b', 'c', ['d', 'e', 'f', 'g']]
    

    个人觉得l1和l2可变元素是共享的,不可变元素是完全隔离的

    四、深拷贝

    如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。

    import copy
    
    l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
    l2 = copy.deepcopy(l1)
    
    l1.append('g')
    
    print(l1)
    
    ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    print(l2)
    
    ['a', 'b', 'c', ['d', 'e', 'f']]
    l1[3].append('g')
    
    print(l1)
    
    ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
    print(l2)
    
    ['a', 'b', 'c', ['d', 'e', 'f']]
    
  • 相关阅读:
    [HNOI2010]CITY 城市建设

    [HNOI2011]数学作业
    [NOI2012]美食节
    [HEOI2014]大工程
    [HEOI2013]ALO(待更)
    [HEOI2016/TJOI2016]序列
    贪食蛇(未完待续)
    [HEOI2016/TJOI2016]字符串
    bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
  • 原文地址:https://www.cnblogs.com/demiao/p/11317840.html
Copyright © 2011-2022 走看看