• python深拷贝与浅拷贝的区别


    可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值

    不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址

    copy.copy:浅拷贝,只拷贝父对象,不会拷贝对象内部的子对象

    copy.decopy:深拷贝,拷贝对象及其子对象

    在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

    import copy
    a = [1, 2, 3, 4, ['a', 'b', 'c']]
    b = a
    c = copy.copy(a)
    d = copy.deepcopy(a)
    print(id(a))
    print(id(b))
    print(id(c))
    print(id(d))
    a.append(5)
    a[4].append('hello')
    print(a)
    print(b)
    print(c)
    print(d)
    
    输出结果:
    3158569704264
    3158569704264
    3158569721032
    3158569746696
    [1, 2, 3, 4, ['a', 'b', 'c', 'hello'], 5]
    [1, 2, 3, 4, ['a', 'b', 'c', 'hello'], 5]
    [1, 2, 3, 4, ['a', 'b', 'c', 'hello']]
    [1, 2, 3, 4, ['a', 'b', 'c']]

    深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象

    浅拷贝,原对象的list元素改变的话会改变当前对象,如果当前对象中list元素改变了,也同样会影响原对象。

    浅拷贝就是藕断丝连

    深拷贝就是离婚了

  • 相关阅读:
    力扣题解 125th 验证回文字符串
    力扣题解 242th 有效的字母异位词
    力扣题解 387th 字符串中的第一个唯一字符
    Ubuntu
    Ubuntu
    Ubuntu
    ubuntu
    go-vscode-ubuntu20.04安装部署
    go-vscode-windows安装部署
    2020年任务
  • 原文地址:https://www.cnblogs.com/wang-mengmeng/p/11670611.html
Copyright © 2020-2023  润新知