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当中的深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章