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()函数是深拷贝,重新开辟了了内存,而且内存中保存了新的值
  • 相关阅读:
    TCP/IP协议栈之QEMU
    FreeRTOS-Plus-CLI中添加一个自己的命令行
    FreeRTOS A57
    log日志库
    函数解读:ioremap / ioremap_nocache / ioremap_wc / ioremap_wt
    Makefile 使用小结
    41. 缺失的第一个正数(First Missing Positive)
    42. 接雨水(Trapping Rain Water)
    关于C++内联和静态成员函数的问题
    C++11 线程并发问题
  • 原文地址:https://www.cnblogs.com/Se7eN-HOU/p/10712488.html
Copyright © 2011-2022 走看看