「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
前言
在日常编码中,我们有时会遇到下面这种情况,使用=进行复制的时候,对新的变量名实现变量修改,原变量值也会发生改变。此现象经常出现在数组的添加与修改中,其本质原因是python拷贝方式不同导致。
赋值拷贝
在前言中,我们实现的就是赋值拷贝,直接通过=,将一个变量使用另外一个变量名进行拷贝,例如上图中的b = a。
在此赋值方法中,是将两变量名指向同一内存对象:
由于是同一对象,当通过b对此内存对象进行修改的同时,在a中也会体现。
浅拷贝
为了解决上面的问题,我们可以采用copy库中的浅拷贝实现复制:
a = Item("abab")
b = copy.copy(a)
b.name = "ababab"
复制代码
调用copy.copy(a),我们就可以重新创建一个新的对象,并为该对象独立分配内存,避免了与原对象发生冲突,运行结果也符合我们的预期:
深拷贝
但是,浅拷贝之所以被称为浅拷贝,是因为其智能重新创建父对象,而在对象内的子对象是不会被再次创建的。
为了方便演示,这里使用对象内嵌list对象进行演示:
可以发现,在a浅拷贝获得了b后,对b内的list对象进行append操作进行修改,a中list打印出来也和b中修改过的list一样了。
此时,如果我们仍需要保证a、b两个对象毫无联系,不再互相干扰,就可以使用深拷贝:
a = Item([1, 2])
b = copy.deepcopy(a)
b.name.append(3)
复制代码
可以发现,在使用深拷贝后,b的修改已经影响不到a了。




近期评论