本文实例讲述了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))) >之前运行结果:
- - -切片操作- - -
id (d)=140436217656904 引用>
=(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却发生了变化,是因为在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深拷贝与浅拷贝用法实例分析