• python深浅拷贝


    浅拷贝copy

    深拷贝deepcopy

    浅拷贝copy

    1)copy就是浅copy,意思是把对象a的所有内容,找到一个内存空间再存放一份,再赋值为新的变量。比如:

    a=[1,2,3]
    from copy import copy
    cpy_a = copy(a)
    
    print(a)     # 此时a的结果为[1,2,3]
    print(cpy_a)  # 此时cpy_a的结果为[1,2,3]
    
    # 这一步是对cpy_a进行操作
    cpy_a.append(4)
    
    # 接下来输出a和cpy_a的结果,看对cpy_a的操作是否会影响到a的值
    print(a)    # 此时a的结果为[1,2,3]
    print(cpy_a)  # 此时cpy_a的结果为[1,2,3,4] 
    

      

    注意区分:copy和赋值,赋值是简单的写了个别名,比如:

    a=[1,2,3]
    b=a

    此时id(a)如果是664d6w,那么id(b)也是664d6w,两者的地址一样,只是名字不同,与浅copy是不一样的 

    深拷贝deepcopy

      针对只含有值的对象来说,浅copy就可以满足,但如果一个对象中又含有其他对象,使用浅copy就只会把包含的id给

    复制一份,那么对新对象的内容的操作就会影响到旧对象的内容。此时就只能使用深拷贝deepcopy,即递归查找引用对象,找到内存单元,拷贝内容并开辟内存空间,再存放一份。

    a=[1,2]
    b=[a,a]#这里是直接引用,就是对象包含对象,想拷贝只能使用深拷贝
    from copy import deepcopy
    dcpy_b=deepcopy(b)
    
    print(b)  # 此时b的结果为[[1,2],[1,2]]
    print(dcpy_b)  # 此时c的结果为[[1,2],[1,2]]
    
    # 对dcpy_b进行操作
    dcpy_b[0].append(3)
    # 接下来输出b和dcpy_b的结果
    print(b)  # 此时b的结果为[[1,2],[1,2]]
    print(dcpy_b)  # 此时dcpy_b的结果为[[1,2,3],[1,2,3]]

    对深拷贝deepcopy后的内容(dcpy_b)做修改不会影响到原内容(b)。

  • 相关阅读:
    Unix高级编程之文件权限
    gdb手册
    libev 使用
    Unix高级环境编程之fcntl函数
    设计基于锁的并发数据结构
    CPU占用分析
    atomic用法
    RESTful架构搜集
    神奇的VIM
    [转] boost:lexical_cast用法
  • 原文地址:https://www.cnblogs.com/liya1014/p/14751554.html
Copyright © 2020-2023  润新知