python当中的深浅拷贝

Posted luffyitach

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python当中的深浅拷贝相关的知识,希望对你有一定的参考价值。

>>>import copy

>>> x={one:1,two:[second,third]}
>>> y=x.copy()  #y是x的浅拷贝
>>> x                #输出x
{two: [second, third], one: 1}
>>> y                #输出y
{two: [second, third], one: 1}
>>> y[one]=0  #对y的键‘one‘的值重新赋值
>>> x
{two: [second, third], one: 1}  #可以看到x的键‘one‘的值没有变
>>> y
{two: [second, third], one: 0}   #y的键‘one‘的值重新赋值后为0
>>> y[two].remove(third)           
#上面是删除y的键‘two‘的值列表里的第二个元素‘third‘
>>> x
{two: [second], one: 1}  
#可以看到x的键‘two‘的值列表里的第二个元素‘third‘也被删除了
>>> y
{two: [second], one: 0}
>>> x[two].remove(second)  
>>> x
{two: [], one: 1}                        
#x的键‘two‘的值列表里的第1个元素‘two‘被删除了
>>> y
{two: [], one: 0}
#y的键‘two‘的值列表里的第1个元素‘two‘被删除了
>>> x[two]=second
>>> x
{two: second, one: 1}
>>> y
{two: [], one: 0}

从上面一段代码可以看到只有删除元素时x才跟着改变,其它不改变,要解决删除时不跟着改变的问题,只有使用深拷贝

 1 >>> from copy import deepcopy          #导入深拷贝模块
 2 >>> x={one:1,two:[2,second]}
 3 >>> y=x.copy()                                  #y为x的浅拷贝
 4 >>> y2=x.deepcopy()                         #y2位x的深拷贝
 5 Traceback (most recent call last):         #错误示范
 6   File "<stdin>", line 1, in ?
 7 AttributeError: dict object has no attribute deepcopy
 8 >>> y2=deepcopy(x)                         
 9 #当采用深拷贝时,要把被深拷贝的对象当参数传入
10 >>> x                                               #输出x
11 {two: [2, second], one: 1}
12 >>> y                                               #输出y
13 {two: [2, second], one: 1}
14 >>> y2                                             #输出y2
15 {two: [2, second], one: 1}
16 >>> y[one]=first                            #对y的键‘one‘重新赋值为first
17 >>> x                                               #可以看到x没有变化
18 {two: [2, second], one: 1}
19 >>> y                                               #重新输出y
20 {two: [2, second], one: first}
21 >>> y2                                             #y2没有变化
22 {two: [2, second], one: 1}
23 >>> y2[one]=1first                        
24 #对y2的键‘one‘重新赋值为1first      
25 >>> x                                                #x没有变化
26 {two: [2, second], one: 1}
27 >>> y
28 {two: [2, second], one: first}       #y没有变化
29 >>> y2                                               #y2为重新赋值后的字典
30 {two: [2, second], one: 1first}
31 >>> x
32 {two: [2, second], one: 1}
33 >>> y[two].remove(2)
34 >>> x
35 {two: [second], one: 1}
36 >>> y
37 {two: [second], one: first}
38 >>> y2
39 {two: [2, second], one: 1first}
40 >>> y2[two].remove(second)         
41 #删除y2键‘two‘的值列表里的‘second‘
42 >>> x
43 {two: [second], one: 1}
44 >>> y
45 {two: [second], one: first}            #x,y都没有变化
46 >>> y2
47 {two: [2], one: 1first}                   #重新输出y2

 



以上是关于python当中的深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

python闭包&深浅拷贝&垃圾回收&with语句

python--is/id==,集合,深浅拷贝

python深浅拷贝

我要学python之深浅拷贝原理

Python 的深浅拷贝 终于明白了

python深浅拷贝