zoukankan      html  css  js  c++  java
  • 简述python中的深浅拷贝

    说到什么是深浅拷贝,就不得不说python中赋值的含义,赋值并不是拷贝,而是将target(变量名)和object(对象本身)建立了一种联系,当一个object可变时,连接该object的任意一个target改变该object值都会影响其他连接该object的target的取值。如:

    >>> a=[1,2,3]
    >>> b=a
    >>> b[0]=0  
    >>> b
    [0, 2, 3]
    >>> a
    [0, 2, 3]
    

     那如果只想改变一个mutable object的值,而它原来的值还保留,该怎么办呢?答案就是拷贝,通过python 内建库copy。

    而拷贝又分为深拷贝(copy.deepcopy)和浅拷贝(copy.copy),深浅拷贝的区别在于对“复合对象”(即该对象还包含了其他对象,如list,dict等)时拷贝的不同:

    对于浅拷贝,新建一个“复合对象”,该对象包含的是被拷贝对象的reference;

    对于深拷贝,新建一个“复合对象”,尽量的把被拷贝对象中含有的对象全都深拷贝;

    如:

    -------------------------shallow copy-------------------
    >>> a=[1,2,3]
    >>> c=a.copy()
    >>> c
    [0, 2, 3]
    >>> c[0]=4
    >>> c
    [4, 2, 3]
    >>> a
    [0, 2, 3]
    
    >>> d=[[0,1],2,3]
    >>> e=d.copy()
    >>> e[0][0]=100
    >>> e
    [[100, 1], 2, 3]
    >>> d
    [[100, 1], 2, 3]
    
    ----------------------deep copy--------------------------
    >>> import copy
    >>> f=copy.deepcopy(d)
    >>> d
    [[100, 1], 2, 3]
    >>> f
    [[100, 1], 2, 3]
    >>> f[0][0]=5
    >>> f
    [[5, 1], 2, 3]
    >>> d
    [[100, 1], 2, 3]
    
    
    >>> g=[[[1],2]]
    >>> h=copy.deepcopy(g)
    >>> h[0][0][0]=100
    >>> h
    [[[100], 2]]
    >>> g
    [[[1], 2]]
    

     当然,对于list,dict自身的copy方法都是shallow copy

    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    减绳子 [二分查找]
    *数据删除*OJ的原题大赏
    多项式大总结
    【YBTOJ】【Luogu P6218】[USACO06NOV] Round Numbers S
    【YBTOJ】【HDU3652】B-number
    【Luogu P5752】[NOI1999] 棋盘分割
    【YBTOJ】【UVA10559】方块消除 Blocks
    【YBTOJ】【Luogu P5020】[NOIP2018 提高组] 货币系统
    【YBTOJ】【Luogu P4180】[BJWC2010]严格次小生成树
    【YBTOJ】【Luogu P2680】[NOIP2015 提高组] 运输计划
  • 原文地址:https://www.cnblogs.com/johnyang/p/13281769.html
Copyright © 2011-2022 走看看