• 第五篇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']]
    
  • 相关阅读:
    [Leetcode] Median of Two Sorted Arrays
    [Jobdu] 题目1463:招聘会
    [Leetcode] Merge Two Sorted Lists
    [Leetcode] Combinations
    [Leetcode] Populating Next Right Pointers in Each Node II
    [Leetcode] Insertion Sort List
    redis在Web中的使用
    设计模式:单例模式
    设计模式:基本法则
    设计模式:工厂模式
  • 原文地址:https://www.cnblogs.com/demiao/p/11317840.html
Copyright © 2020-2023  润新知