拷贝就是拷贝,何来深浅之说?
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果
其实这个是由于共享内存导致的结果
浅拷贝
l1 = [1,2,3,[11,22,33]] l2 = l1.copy() print(l2) #[1,2,3,[11,22,33]] l2[3][2]=[111,'aaa',333] print(l1) #[1, 2, 3, [11, 22, [111, 'aaa', 333]]] print(l2) #[1, 2, 3, [11, 22, [111, 'aaa', 333]]] l1[0]= 0 print(l1) #[0, 2, 3, [11, 22, [111, 'aaa', 333]]] print(l2) #[1, 2, 3, [11, 22, [111, 'aaa', 333]]]
如上述代码,l2copy了l1 ,之后l2把其列表中的列表的元素给修改,从结果看出,l1也被修改了。但是仅仅修改l1列表中的第一层元素,却并没有影响l2.
如图,这就是浅拷贝的原理,l2拷贝l1的时候只拷贝了他的第一层,也就是在其他内存中重新创建了l1的第一层数据,但是l2无法拷贝l1的第二层数据,也就是列表中的列表,所以他就只能指向l1中的第二层数据
由此,当修改l1中第二层数据的时候,浅拷贝l1的l2中的第二层数据也随之发生改变
深拷贝
深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享。
深拷贝的方法有
1.最直接的赋值
l2 = l1
2.导入模块
import copy l1 = [1, 2, 3, [11, 22, 33]] # l2 = copy.copy(l1) 浅拷贝 l2 = copy.deepcopy(l1) print(l1,'>>>',l2) l2[3][0] = 1111 print(l1,">>>",l2)