Python之深浅拷贝

拷贝就是拷贝,何来深浅之说?

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)

  

猜你喜欢

转载自www.cnblogs.com/echoboy/p/9059183.html