深浅拷贝概述
在Python中,对象是通过引用传递的,这意味如果创建了一个对象,然后将其赋值给另一个变量,那么两个变量将引用同一个对象,即a = [3, 4] b = list(a)
b也为[3, 4],这就是所谓的浅拷贝;但有时候我们需要复制一个对象,以便我们能够独立地修改其中一个副本,而不影响原始对象。这时我们的Python就提供了两种方式:浅拷贝和深拷贝。
浅拷贝和深拷贝是指对可变对象对进行复制时所采用的两种不同的方式。深浅拷贝的意义在于编程过程中,根据选择合适的拷贝方式,在避免原始对象被修改的同时,还能避免额外的内存开销。如果需要修改拷贝后的对象而不影响原始对象,则应使用深拷贝。而浅拷贝主要是对第一层数据的值进行拷贝,对第二层数据进行引用,在进行简单的操作时可以使用。
他主要应用于多线程中,如果多线程需要同时操作同一个数据结构,那么为了避免并发访问的冲突,通常会使用深拷贝创建多个完全独立的数据结构,从而使每个线程都可以独立地操作自己地数据结构而不会影响其他线程。如果只需要复制对象地部分属性或方法,那么使用浅拷贝即可。
浅拷贝
在Python中,浅拷贝只是创建一个新的对象,然后将原始对象中的第一层所有元素的复制到新对象中,第二层则是将引用复制到新对象。如果原始对象第二层包含可变对象(列表、字典等),那么拷贝后的对象的第二层也将包含相同的可变对象的引用,因此,如果对原始对象第二层的值进行改变,那么拷贝的对象也会受到同样的改变。如果原始为不可变对象,则原始值不会受到改变。
例举一个列表,并改变值,具体代码如下:
import copy
list1 = [1, 2, 3, 4, 5]
list2 = copy.copy(list1)
print("拷贝前的list2值", list2)
list1[3] = 6
print("改变后的list1值", list1)
print("改变后的list2值", list2)
结果如下:
例举一个嵌套列表,并改变第二层的值,具体代码展示如下:
import copy
list1 = [1, 2, 3, [4, 5], [6, 7]]
list2 = list1.copy()
list3 = copy.copy(list1)
print("拷贝前的list2值", list2)
print("拷贝前的list3值", list3)
list1[3][1] = 6
print("改变后的list1值", list1)
print("改变后的list2值", list2)
print("改变后的list3值", list3)
结果如下:
由此可以得出结论,浅拷贝只拷贝第一层,第二层拷贝的是原始对象的引用,如果原始对象的第二层进行了改变,则相应的拷贝对象的值也会改变。
深拷贝
深拷贝则会递归复制所有地可变对象和不可变对象,从而创建一个完全独立的新对象,并不会拷贝原始对象的引用。这意味着如果拷贝后的对象修改了其中的一个可变对象的值,那么原始对象不会受影响。
改变列表第一层的值,具体代码展示如下:
import copy
list1 = [1, 2, 3, [4, 5], [6, 7]]
list2 = copy.deepcopy(list1)
print("改变前的list2值", list2)
list1[2] = 9
print("改变后的list1值", list1)
print("改变后的list2值", list2)
结果如下:
改变列表第二层的值,具体代码展示如下:
import copy
list1 = [1, 2, 3, [4, 5], [6, 7]]
list2 = copy.deepcopy(list1)
print("改变前的list2值", list2)
list1[3][1] = 6
print("改变后的list1值", list1)
print("改变后的list2值", list2)
结果如下:
由此可以得出结论,深拷贝只是复制了值,并没有进行引用,即创建一个完全独立的对象,即使对原始对象的值进行了修改,也不会改变拷贝对象的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)