python中的引用、浅拷贝和深拷贝

       变量名和对象之间,存在引用的关系,即变量名通过引用指向对象,而对象和其在内存中的数据又存在复杂关系,在python中的对象是一种高级抽象,所以并没有简单的指针概念。对象本身在内存中是一个独立的存在,一个对象的值可能包含多个其他对象的值的指针,也就是共享内存。当两个变量具有相同的引用时,那么这两个变量肯定具有相同的内存地址,因为它们指向了同一个对象;而两个不同的对象具有不同的内存地址,但是其子值可能是共享内存的,比如两个列表对象,共享一个子列表对象。例如下面的l1和l2具有相同的引用,所以其指向同一个对象,具有相同的内存地址,不涉及任何复制;而l3和l4虽然是不同对象,具有不同的内存地址,但是其共享l1的值所在的内存。所以当修改了l1时,l2、l3和l4都会改变。

l1 = [1,2]
l2 = l1
l3 = [1,l1]
l4 = l3.copy()

       上面的copy函数实际上是一种浅拷贝,也就是其只拷贝父对象,不会拷贝父对象下的子对象,即l4不会拷贝l3中的l1,而是和l3共享l1。但是如果我们不想让l4和l3有任何的关联,那么可以通过深拷贝实现,深拷贝就是完全在内存中复制一个全新的对象,两者完全独立。而深拷贝需要通过导入python的内置库copy,然后copy库的deepcopy函数来实现深拷贝,如下所示,l5是l3的一个深拷贝,这时l5和l3在内存中完全独立,不会相互影响。

import copy
l5 = copy.deepcopy(l3)

猜你喜欢

转载自blog.csdn.net/S_o_l_o_n/article/details/108818499