python当中的深浅拷贝

时间:2021-05-27 19:49:24
>>>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