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]

 

posted @ 2018-03-09 09:26  Reid21  阅读(151)  评论(0)    收藏  举报