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

    一.引言

    在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

    针对该列表l1=['a','b','c',['d','e','f']]一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝

    注意:拷贝/浅拷贝/深拷贝都是针对可变类型数据而言的

    1.1 可变或不可变

    • ID不变值可变,即在原值的没基础上修改,则为可变数据类型

    • 值遍ID也变,即重新申请一个空间放入新的值,则为不可变数据类型

    age = 19
    print(f'first:{id(age)}')
    age = 20
    print(f'second:{id(age)}')
    
    #first:270493056
    #second:270493072
    

    二.拷贝

    如果L2是L1的拷贝对象,那么L1内部任何元素的变化,L2也会随之改变,因为可变类型id值id不变

    l1 = ['1','2','3','4']
    l2 = l1
    l1.append('g')
    print(l1)
    print(l2)
    
    #['1', '2', '3', '4', 'g']
    #['1', '2', '3', '4', 'g']
    

    三.浅拷贝

    • 如果L2是L1的浅拷贝对象,则L1内的里不可变元素发生了改变,L2 不变

    • L1内的可变元素发生了改变,则L2会跟着变

    import  copy
    
    l1 = ['1','2','3',['4','5']]
    l2 =  copy.copy(l1)
    
    l1.append('6')
    print(l1)
    print(l2)
    
    #['1', '2', '3', ['4', '5'], '6']
    #['1', '2', '3', ['4', '5']]
    
    l1[3].append('7')
    print(l1)
    print(l2)
    
    #['1', '2', '3', ['4', '5', '7'], '6']
    #['1', '2', '3', ['4', '5', '7']]
    

    深拷贝

    如果l2是l1的深拷贝对象,那么:

    • l1内的不可变芫荽发生了改变,l2不变

      l1内的可变元素发生了改变,l2叶不变

      即:l2不会随l1改变而改变

    import copy
    
    l1 = ['1','2','3',['4','5']]
    l2 = copy.deepcopy(l1)
    
    l1.append('6')
    print(l1)
    print(l2)
    
    #['1', '2', '3', ['4', '5'], '6']
    #['1', '2', '3', ['4', '5']]
    
    l1[3].append('7')
    print(l1)
    print(l2)
    
    #['1', '2', '3', ['4', '5', '7'], '6']
    #['1', '2', '3', ['4', '5']]
    
  • 相关阅读:
    Python自定义web框架、Jinja2
    Django初探(模板渲染、模板语音、simple_tag、母版子版、静态配置文件)
    多线程 threading
    python操作mysql
    sql 汉字转首字母拼音
    添加sql server约束
    NFS,Memcached,Tokyo tyrant实现session共享性能测试
    让Editplus自动格式化js、css、html。。。
    sql server中利用sql语句如何创建角色和用户
    asp网站文件夹权限设置
  • 原文地址:https://www.cnblogs.com/LWX-YEER/p/11266400.html
Copyright © 2011-2022 走看看