Python攻克之路-深浅拷贝
场景引入:一个列表存了字符串,需要拷贝一份来单独操作,而不影响之前的数据
分析:如下的做法是用于数据量比较小的,如果数据量大根本用不了
In [1]: s=[1,'lin','you'] In [2]: s1=[1,'lin','you'] #和s一样的值 In [3]: s1[0]=2 #修改s1,对于s没有影响 In [4]: print(s) [1, 'lin', 'you'] In [5]: print(s1) [2, 'lin', 'you']
Python拷贝的实现
a.copy方法(一般情况的实现)
In [6]: s=[1,'lin','you'] In [7]: s2=s.copy() In [8]: print(s2) [1, 'lin', 'you']
修改s2,对于s本身的数据没有影响
In [9]: s2[0]=3 In [10]: print(s) [1, 'lin', 'you'] In [11]: print(s2) [3, 'lin', 'you']
b. 浅拷贝
当列表里面嵌套列表,对列表里的列表修改,对源数据有影响,两个之间是有关联,并不是独立内存空间
In [13]: s3=s.copy() In [14]: print(s3) [[1, 2], 'lin', 'you'] In [15]: s3[0][1]=3 ##只修改s3 In [16]: print(s3) [[1, 3], 'lin', 'you'] In [17]: print(s) [[1, 3], 'lin', 'you'] ##s也有影响
浅拷贝分析过程
python内存变量的指向过程

列表存储列表的存储过程
In [18]: a=[[1,2],3,4] In [19]: b=a.copy() ##b=a[:] In [20]: print(b) In [18]: b[1]=5 In [18]: b[0][0]=8
分析:a里面有三个元素,a[0]地址指针为0066,a[1]地址指针为0033,a[2]地址指针为0044,a[0]是一个列表,a[0]里面有两个整型的对象,分别有自己的内存地址1是0019,2是0025,a[0]是一个列表,存的是一个列表的内存地址0066,列表里分别有两个值b=a.copy()创建b,b有自身的一个内存地址,里面的值也是存的和a的一样的值,把指针分别指向a一样的内存地址,所以当打印三个值时,是会显示一样的值
修改的情况:
当要修改3或者4时,只是把b的指针指向一个新的地址,而a的指针没有动,所以没有发生变化
当要修改列表的值时,如把b[0][0]=1修改成8时,列表里的1值的指针重新指向一个新的值



c. 赋值与浅拷贝的区别
In [1]: a=[[1,2],3,4] In [2]: b=a ##是共享的,ab指向一样,无论第一层第二层修改,对源值都有影响 In [3]: b[1]=99 In [4]: print(a) [[1, 2], 99, 4] In [5]: print(b) [[1, 2], 99, 4] In [6]: b=a.copy() ##浅拷贝只copy第一层(相当于3,4是独立的),修改第一层的,源值不受影响 In [7]: b[1]=88 In [8]: print(a) [[1, 2], 99, 4] In [9]: print(b) [[1, 2], 88, 4]
d.浅拷贝使用场景:银行开卡,夫妇开关联账号,两张卡共享一个账号,就会产生一个使用问题,一个人使用,另一个账号同时要有操作
In [1]: man = ["tom",890,[14000,9000]] ##男方开通一账号,用户名,用户id,额度,金额 In [2]: lady=man.copy() ##女方也开通基于男方生成的 In [3]: lady[0]="betty" ##修改女方的用户名和用户id In [4]: lady[1]=456 In [5]: print(man) ['tom', 890, [14000, 9000]] ##类似于生成同一账户,不同用户名和id的两张银行卡 In [6]: print(lady) ['betty', 456, [14000, 9000]] In [7]: man[2][1] -= 4000 ##当某一方使用时,双方都有影响 In [8]: print(man) ['tom', 890, [14000, 5000]] In [9]: print(lady) ['betty', 456, [14000, 5000]]
e.深拷贝
In [1]: import copy ##导入copy模块 In [2]: a=[[1,2],3,4] In [3]: b=copy.deepcopy(a) ##这是深copy,浅copy使用copy.copy() In [4]: b[0][0]=99 In [5]: print(a) [[1, 2], 3, 4] In [6]: print(b) #完全独立的数据 [[99, 2], 3, 4]

浙公网安备 33010602011771号