『python思考』关于列表的浅复制和深复制的理解

>>> mylist1 = [1, 2, 3, 4]  
>>> myl = mylist1  
>>> myl  
[1, 2, 3, 4]  
>>> mylist1[0] = 5  
>>> mylist1  
[5, 2, 3, 4]  
>>> myl  
[5, 2, 3, 4]  

这个就是浅复制

浅复制仅仅只是复制了对对象的引用,即 mylist1 和 myl 指向的是同一个对象,所以如果改变了该对象的元素的话,则 mylist1 和 myl 所指向的对象都会改变,因为实际上就是同一个对象。

>>> id(mylist1)  
202009976  
>>> id(myl)  
202009976  

可以看出两者指向的对象在内存中的地址是相同的,即是同一个对象

>>> import copy  
>>> mylist2 = [5, 6, 7, 8]  
>>> myl2 = copy.deepcopy(mylist2)  
>>> mylist2[0] = 9  
>>> mylist2  
[9, 6, 7, 8]  
>>> myl2  
[5, 6, 7, 8]  

这个就是深复制

>>> id(mylist2)  
200662512  
>>> id(myl2)  
202007336  

深复制后的两个变量则指向的是两个不同的对象,可以把这两个对象理解为张得一模一样的双胞胎,虽然很像,但实际上是两个不同的人,所以其中一个人发生了改变(如受伤了)也不会影响到另一个人。

>>> id(mylist3[0])  
30909144  
>>> id(myl3[0])  
30909144  
>>> id(mylist3[3])  
200634696  
>>> id(myl3[3])  
202008136  
>>> mylist3 = [1, "a", 3, [4, 5, 6], [[7, 8, 9]]]  
>>> myl3 = copy.deepcopy(mylist3)  
>>> id(mylist3[1])  
31110016  
>>> id(myl3[1])  
31110016  

但是如果 mylist3 和 myl3 的元素指向的是同一个 『不可变』 的对象时,则 他们指向的仍然是同一个对象, 如 1 和 "a"

转载自  https://blog.csdn.net/Sbtgmz/article/details/52619202


猜你喜欢

转载自blog.csdn.net/wz947324/article/details/80632283