深浅拷贝

Posted li-jj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深浅拷贝相关的知识,希望对你有一定的参考价值。

赋值:

  • 没有创建新的对象,多个变量指向一个对象,与拷贝无关
  • 技术分享图片
    a=[1,2,3,[4,5]]
    b=a
    print(a,id(a))#[1, 2, 3, [4, 5]] 1807996384072
    print(b,id(b))#[1, 2, 3, [4, 5]] 1807996384072
    
    a.pop()
    print(a,id(a))#[1, 2, 3] 1807996384072
    print(b,id(b))#[1, 2, 3] 1807996384072
    View Code技术分享图片View Code

浅拷贝:

  • 只拷贝第一层,第二层不会被拷贝
  • 技术分享图片
    l1=[1,2,3,[barry,alex]]
    l2=l1.copy()
    print(l1,id(l1))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2578599060616
    print(l2,id(l2))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2578599889480
    l1.append(wusir)
    print(l1,id(l1))#[1, 2, 3, [‘barry‘, ‘alex‘], ‘wusir‘] 2578599060616
    print(l2,id(l2))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2578599889480
    l1[0]=333
    print(l1,id(l1))#[333, 2, 3, [‘barry‘, ‘alex‘]] 2578599060616
    print(l2,id(l2))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2578599889480
    内存地址不同,被拷贝的对象作出改变,另一个不改变
    View Code

深拷贝:

  • 创建一个新的对象,把内部所有的元素都进行拷贝,不会产生一个变另一个跟着变
  • 技术分享图片
    import copy
    l1=[1,2,3,[barry,alex]]
    l2=copy.deepcopy(l1)
    print(l1,id(l1))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2037159109640
    print(l2,id(l2))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2037157644168
    
    l1[1]=222
    print(l1,id(l1))#[1, 222, 3, [‘barry‘, ‘alex‘]] 2037159109640
    print(l2,id(l2))#[1, 2, 3, [‘barry‘, ‘alex‘]] 2037157644168
    View Code

以上是关于深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

《关于JavaScript的深浅拷贝》

python--is/id==,集合,深浅拷贝

python深浅拷贝

我要学python之深浅拷贝原理

Python高级语法-深浅拷贝-总结(4.2.1)

Python 的深浅拷贝 终于明白了