Python深拷贝与浅拷贝用法实例分析

  

本文实例讲述了Python深拷贝与浅拷贝用法。分享给大家供大家参考,具体如下:

  

<强> 1,对象的赋值

  

对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

  

当对对象做赋值或者是参数传递或者作为返回值的时候,总是传递原始对象的引用,而不是一个副本。如下所示:

  

在python中将一个变量赋值给另一个变量,传递的是引用。无论是一个的内层变化还是外层变化,b都会发生同样的变化。因为b和a指向了同一个引用。类似于c语言中的同一片内存地址。

        #=utf - 8编码=(1、2、3,' a ', ' b ', ' c ']]   b=一个   打印(‘*’* 50)   print (“——b=?   打印(a=% s的%)   打印(" b=% s ' % b)   a.append (4)   打印(' - - -外层一个增加了元素4 - - - - - -”)   打印(a=% s的%)   打印(" b=% s ' % b)   打印(' - - -内层增加了元素“d”——“)   [3].append (' d ')   打印(a=% s的%)   打印(" b=% s ' % b)      之前      

运行结果:

  
  

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  - - - b=- - - - - -
=(1、2、3,' a ', ' b ', ' c ']]
  b=[1、2、3, [' a ', ' b ', ' c ']]
  - - -外层一个增加了元素4 - - - - - -
=(1、2、3,' a ', ' b ', ' c '], 4]
  b=[1、2、3, [' a ', ' b ', ' c '], 4]
  - - - - - -内层增加了元素' d ' - - - - - -
  a=[1、2、3, [a, b, c, d '), 4]
  b=[1、2、3, [a, b, c, d '), 4]

     

<强> 2,对象的复制

  

当你想修改一个对象,而且让原始的对象不受影响的时候,那么就需要使用到对象的复制,对象的复制可以通过三种方法实现:

  

,使用切片操作进行拷贝——切片操作

  

(注:切片技术应用于所有的序列,包括:列表,字符串,元祖,但切片不能应用于字典。对字典只能使用<代码> D.copy() 方法或<代码> D.deepcopy() 方法。)

  

b,使用工厂函数进行拷贝,列表/dir/设置——-factoryfunction

  c

, <代码> copy.copy() )copymodule

  

在复制的时候,使用的是浅拷贝,复制了对象,但是对象中的元素,依然使用引用。

  

如下所示:

  

=(1、2、3, (' a ', ' b ', ' c ']]

        #=utf - 8编码   进口复制   # 1。切片操作   打印(' - - -切片操作——“)   b=[:]   打印(“=% s \ tid (a)=% s ' % (a, id (a)))   打印(" b=% s \ tid (b)=% s ' % (b, id (b)))   # 2。使用工厂函数   打印(' - - -使用工厂函数——“)   c=列表(一个)   打印(“=% s \ tid (a)=% s ' % (a, id (a)))   打印(c=%年代\ tid (c)=% s ' % (c, id (c)))   # 3. copy.copy ()   打印(' - - - copy.copy ()——“)   d=copy.copy (a)   打印(“=% s \ tid (a)=% s ' % (a, id (a)))   打印(d=%年代\ tid (d)=% s ' % (d id (d)))      之前      

运行结果:

  
  

- - -切片操作- - -
=(1、2、3,' a ', ' b ', ' c ']],id (a)=140676047022088
  b=[1、2、3, [' a ', ' b ', ' c ']],id (b)=140676047021320
  - - - - - -使用工厂函数- - - - - -
=(1、2、3,' a ', ' b ', ' c ']],id (a)=140676047022088
  c=[1、2、3, [' a ', ' b ', ' c ']],id (c)=140676047101640
  - - - copy.copy () - - - - - -
=(1、2、3,' a ', ' b ', ' c ']],id (a)=140436217635720
  d=[1、2、3, [' a ', ' b ', ' c ']],

id (d)=140436217656904      

在使用浅拷贝的时候,发现引用的身份证都是相同的,但是字符串的id却发生了变化,是因为在python中,字符串是不可变的,从而在每次进行修改的时候,都是新建一个对象,从而引用发生了变化。

  

在不可变类型中,数字和字符串都是不可变类型,从而在每次修改的时候,都是新创建一个对象。

  

<强> 3模块

  

核心模块:复制

  

浅拷贝和深拷贝的操作都可以在复制模块中找的到,其实复制模块中只有两个函数可用,副本()进行浅拷贝操作,而deepcopy()进行深拷贝操作。

  

如下所示:

        #=utf - 8编码   进口复制=(1、2、3,' a ', ' b ', ' c ']]   #浅拷贝拷贝的是外层即顶级对象,对于内层只拷贝引用   #所以在一个的外层增加了元素,而c并没有变化。而在一个的内层增加元素后,c发生了同样的变化。(回顾b=)   打印(‘*’* 50)   打印(' - - - c=copy.copy (a)——“)   c=copy.copy (a)   打印(a=% s的%)   打印(c=% s的% c)   a.append (4)   打印(' - - -外层一个增加了元素4 - - - - - -”)   打印(a=% s的%)   打印(c=% s的% c)   打印(' - - -内层增加了元素“d”——“)   [3].append (' d ')   打印(a=% s的%)   打印(c=% s的% c)   #深拷贝会递归的拷贝所有内容,将所有的内容都独自拷贝了一份。   #故而,无论一个的外层还是内层发生变化,都不会影响到d。   打印(‘*’* 50)   打印(' - - - d=copy.deepcopy (a)——“)   d=copy.deepcopy (a)   打印(a=% s的%)   打印(d=% s的% d)   a.append (5)   打印(' - - -外层一个增加了元素5 - - -)   打印(a=% s的%)   打印(d=% s的% d)   打印(' - - -内层增加了元素“e”——“)   [3].append (“e”)   打印(a=% s的%)   打印(d=% s的% d)      

Python深拷贝与浅拷贝用法实例分析