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

    先弄懂下面概念

    变量 --引用--对象--(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝)

    变量是一个系统表的元素,拥有指向对象的链接的空间

    对象是被分配的一块内存,存储其所代表的值

    引用是自动形成的从变量到对象的指针

    在python中不可变对象知:一旦创建就不可修改对象,包括字符创,元组,数字

    在python中可变对象是指:可以修改的对象,包括:列表,字典

    1.不可变对象的赋值

    a的值发生改变,b不会跟着改变

    a = 1
    b = a
    print(a)
    print(b)
    a  = 3
    print(a)
    print(b)
    
    结果:
    1
    1
    3
    1

    2.可变对象的赋值

    a发生改变,b也跟着改变

    a = [1,2]
    b = a
    print(a)
    print(b)
    a[0] = 3
    print(a)
    print(b)
    
    
    结果:
    [1, 2]
    [1, 2]
    [3, 2]
    [3, 2]

    要想b的值不会改变,就要用到copy模块

    3.深浅拷贝

    浅拷贝:只拷贝顶级的对象,或者说:父级对象

    深拷贝:拷贝所有对象,顶级对象以及嵌套对象。或者说:父级对象以及子对象

    import copy
    
    #第二种,字典中有嵌套
    d = {'name':{'first':'zhang','last':'derek'},
        'job':['IT','HR']}
    c1 = copy.copy(d)
    c2 = copy.deepcopy(d)
    print(id(d),id(c1),id(c2))    #31157416 31940256 35946856
    
    d['job'][0] = 'tester'
    print(d,c1,c2)
    # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
    # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
    # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['IT', 'HR']}
    
    源对象修改值的时候,浅拷贝的值跟着改变,深拷贝的值没变
    import copy
    
    #第二种,字典中有嵌套
    d = {'name':{'first':'zhang','last':'derek'},
        'job':['IT','HR']}
    c1 = copy.copy(d)
    c2 = copy.deepcopy(d)
    print(id(d),id(c1),id(c2))    #31157416 31940256 35946856
    
    d['job'][0] = 'tester'
    print(d,c1,c2)
    # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
    # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
    # {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['IT', 'HR']}
    
    源对象修改值的时候,浅拷贝的值跟着改变,深拷贝的值没变

    结论:

    • 深浅拷贝都是对源对象的复制,占用不同的内存空间
    • 如果源对象只有一级目录的话,源做任何改动,都不会影响深浅拷贝对象
    • 如果源对象不止一级目录的话,源做任何改动。都要影响浅拷贝,但不影响深拷贝
    • 序列对象的切片其实是浅拷贝,即只拷贝顶级对象
  • 相关阅读:
    常用DOS命令大全2
    常用DOS命令大全1
    2020年3月13日Java面试记录
    MySQL Transaction--Sprint中访问只读从库的设置
    MySQL Transaction--TPS计算规则
    MySQL Inport--导入数据
    MySQL Export--导出数据
    MySQL--InnoDB并发线程控制
    MySQL--线程池(Thread Pool)
    MySQL 5.7--复制延迟监控
  • 原文地址:https://www.cnblogs.com/xuyxbiubiu/p/10397487.html
Copyright © 2011-2022 走看看