• 技术文章 >Python技术 >Python高级

    Python深浅拷贝是什么

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-06-29 09:15:13原创2899

    一、浅拷贝

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

    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]

    相关推荐:《Python视频教程

    三、深浅拷贝对比

    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]]

    说明:

    1.c和d的内存地址一样,说明是浅拷贝,两个引用指向的是同一块内存。

    2.c,e,f内存地址不一样,说明e和f都是深拷贝,都重新开辟的内存地址。

    3.在a追加了元素44之后,打印的e中并有追加44,说明深拷贝,内容独立。

    4.在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()函数是深拷贝,重新开辟了了内存,而且内存中保存了新的值。

    专题推荐:python 深拷贝 浅拷贝
    上一篇:Python中包如何发布? 下一篇:Python创建生成器的两种方法

    相关文章推荐

    • Python中包如何嵌套• Python中包如何发布?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网