zoukankan      html  css  js  c++  java
  • python高级-深浅拷贝(16)

    一、浅拷贝

    浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容。

    a = [1,2,3]
    print(id(a))
    b=a
    print(b)
    print(id(b))
    a.append(4)
    print(a)
    print(b)

    运行结果为:

    1965053928072
    [1, 2, 3]
    1965053928072
    [1, 2, 3, 4]
    [1, 2, 3, 4]

    二、深拷贝

     深拷贝是对于一个对象所有层次的拷贝,重新开辟内存地址。

    import copy
    a = [1,2,3]
    print(id(a))
    #使用copy模块
    b = copy.deepcopy(a)
    #打印b的内存地址
    print(id(b))
    a.append(4)
    print(a)
    print(b)

    运行结果为:

    2035157969672
    2035158105992
    [1, 2, 3, 4]
    [1, 2, 3]

    三、深浅拷贝对比

    import copy
    a = [1,2,3]
    b = [4,5,6]
    c = [a,b]
    
    d = c #直接赋值,浅拷贝
    print("c的内存地址为:%s"%id(c))
    print("d的内存地址为:%s"%id(d))
    
    #使用copy模块
    #深拷贝,重新开辟内存,并内容独立
    e = copy.deepcopy(c)
    #深拷贝,重新开辟内存,但是新内容里面仍保存原来的引用
    f = copy.copy(c)
    #打印e,f的地址
    print("e的内存地址为:%s"%id(e))
    print("f的内存地址为:%s"%id(f))
    
    #改变a的值
    a.append(44)
    
    #打印a,b,c,d,e,f
    print("a = %s"%a)
    print("b = %s"%b)
    print("c = %s"%c)
    print("d = %s"%d)
    print("e = %s"%e)
    print("f = %s"%f)

    运行结果为:

    c的内存地址为:2514746494856
    d的内存地址为:2514746494856
    e的内存地址为:2514746494920
    f的内存地址为:2514746494664
    a = [1, 2, 3, 44]
    b = [4, 5, 6]
    c = [[1, 2, 3, 44], [4, 5, 6]]
    d = [[1, 2, 3, 44], [4, 5, 6]]
    e = [[1, 2, 3], [4, 5, 6]]
    f = [[1, 2, 3, 44], [4, 5, 6]]

    说明:

    • c和d的内存地址一样,说明是浅拷贝,两个引用指向的是同一块内存
    • c,e,f内存地址不一样,说明e和f都是深拷贝,都重新开辟的内存地址
    • 在a追加了元素44之后,打印的e中并有追加44,说明深拷贝,内容独立
    • 在a追加了元素44之后,打印的f中也追加44,说明f也重新开辟了内存,但是新内容里面保存的是原来的引用

    四、copy对可变和不可变对象的不同

    1、可变类型使用copy

    import copy
    a = [1,2,3]
    b = copy.copy(a)
    print(id(a))
    print(id(b))
    
    a.append(4)
    print(a)
    print(b)

    运行结果为:

    1626677717832
    1626677715784
    [1, 2, 3, 4]
    [1, 2, 3]

    2、不可变类型使用copy

    import copy
    a = (1,2,3)
    b = copy.copy(a)
    print(id(a))
    print(id(b))

    运行结果为:

    2043444280704
    2043444280704

    总结:

    • 简单的赋值是浅拷贝
    • copy模块里面的copy()函数可以做一层深拷贝,虽然重新开辟了新的内存,但新内存里面仍然存放得是原来的引用,
    • copy模块中的deepcopy()函数是深拷贝,重新开辟了了内存,而且内存中保存了新的值
  • 相关阅读:
    第8章 对象的容纳
    第 4 章 初始化和清除
    第 3 章 控制程序流程
    maven教程
    使用Eclipse构建Maven项目 (step-by-step)
    将 Maven生成的java项目转化为支持 Eclipse IDE的项目
    eclipse 中修改 M2_REPO的值
    FilenameUtils工具类
    导出excel小结(C#,.NET,Wpf)
    NPOI导出Excel表功能实现(多个工作簿)(备用)
  • 原文地址:https://www.cnblogs.com/Se7eN-HOU/p/10712488.html
Copyright © 2011-2022 走看看