Python之深浅拷贝

'''
预备知识 : 
    数据在内存中的具体存储方式 : 内存是由一个又一个字节组成,而每一个字节都有一个唯一的地址,而数据在内存中即是从地址大的字节开始存储,也即内存寻址从大到小,
                    以lst = [3,2,3,2,1],假定一个整数在内存中占用两个字节,在内存中的存储为例,具体如下 :
           
'''

  

地址 变量
0xffffffff001

0xffffffff002

0xffffffff003 lst[0]
3
0xffffffff004
0xffffffff005 lst[1] 2
0xffffffff006
0xffffffff007 lst[2] 3
0xffffffff008
0xffffffff009 lst[3]
2
0xffffffff010
0xffffffff011 lst[4] 1
0xffffffff012
'''
当在结构性数据中又嵌套一个结构性数据时,如在列表中有嵌套一个列表,
以lst = [3, 2, [4, 3, 2], 4]为例说明其在内存中的存储方式 : 
'''
地址 变量
0xffffffff001

0xffffffff002

0xffffffff003

0xffffffff004

0xffffffff005 lst[0] 3
0xffffffff006
0xffffffff007 lst[1] 2
0xffffffff008
0xffffffff009 lst[2]
0xfffffffff07
0xffffffff010
0xffffffff011 lst[3] 4
0xffffffff012

'''
当代码执行至lst[2]分配内存空间时,又会开辟一块新的内存空间分配给lst[2]如下:

'''
地址 变量
0xfffffffff01

0xfffffffff02

0xfffffffff03

0xfffffffff04

0xfffffffff05
0xfffffffff06

0xfffffffff07 lst[2][0] 4
0xfffffffff08
0xfffffffff09 lst[2][1]
3
0xfffffffff10
0xfffffffff11 lst[3][2] 2
0xfffffffff12

'''
为lst[2]分配完内存空间后,将lst[2]的地址,也即所谓内存空间的最小地址,存入lst[2]在lst中位置,以指向lst[2]在内存的存储位置

'''
'''
浅拷贝 : 即只复制目标对象,但不复制与目标对象有关的对象,如 :
方式一 :
lst = [3, 2, [4, 3, 2], 4]
lst1 = lst[ : ]    #执行此时,会为lst1开辟一块新的内存空间,并将上文中的第一块内存空间里的内容复制到新的内存空间中,但并不会为lst1复制一份新的上文中的第二块内存空间,
                     也即此时lst和lst1共用上文中的第二个表格代表的内存空间,此时,如果修改上文中第二块内存空间中的值,lst和lst1中的值会跟着一起改变
方式二 :
lst1 = lst.copy()    #同样是一种浅拷贝方式
#注 : lst1 = lst 与浅拷贝不同,赋值是直接将lst的在内存中的地址赋值给lst1,类似于小数据池                     
深拷贝 : 将目标对象及与目标对象相关的所有对象全部都复制一份
    import copy
    lst1 = copy.deepcopy(lst)
'''













上一篇:python3 is和==


下一篇:Python3基本数据类型