python_深浅拷贝
1、赋值:
1 list_1=[['a','b'],1,2] 2 list_2=list_1 3 4 print(list_1) 5 print(list_2) >>>[['a', 'b'], 1, 2] >>>[['a', 'b'], 1, 2]
在python3中赋值操作其实就是对象的应用,如上边的例子list_1与list_2这俩变量指向的都是同一块内存地址,也就是说list_2并没有重新开辟一块属于自己内存空间。
(通过id( )函数可以查看对象的内存地址)
1 print(id(list_1)) 2 print(id(list_2))
>>>1656445373192
>>>1656445373192
共同指向同一个内存地址(1656445373192),如果把这块内存空间看成一个房间的话,那就是给这个房间找了两个主人,房间里的所有东西属于两人的公共财产,同进退,共生死!
1 list_1=[['a','b'],1,2] 2 list_2=list_1 3 4 list_2[0][0]="aaa" 5 list_1[2]=222 6 7 print(list_1) 8 print(list_2) >>>[['aaa', 'b'], 1, 222]
>>>[['aaa', 'b'], 1, 222]
10 del list_1 #deL函数只能删除变量名,对内存地址不做操作 11 print(list_2)
>>>[['aaa', 'b'], 1, 222]
11 list_2.clear() #clear()函数不删除变量名,但会清除对应的内存空间
12 print(list_1)
>>>[]
2、浅拷贝
1 list_1=[['a','b'],1,2] 2 3 #浅拷贝的三种形式,结果是一样的 4 list_2=list_1.copy() 5 list_2=list_1[:] 6 7 import copy 8 list_2=copy.copy(list_1)
浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层
1 list_1=[['a','b'],1,2] 2 list_2=list_1.copy() 3 4 list_2[0][0]="aaa" 5 list_2[2]=222 6 print(list_1) 7 print(list_2)
>>>[['aaa', 'b'], 1, 2]
>>>[['aaa', 'b'], 1, 222]
如图所说:list_2=list_1.copy() 其实等于 list_2=[[000123],1,2]。也就是说只有小列表中的元素是两人的公共财产(好比俩人的孩子),1和2 赋予各自的私有财产。
3、深拷贝
1 list_1=[['a','b'],1,2] 2 3 import copy 4 list_2=copy.deepcopy(list_1) 5 6 list_2[0][0]="aaa" 7 list_2[2]=222 8 9 print(list_1) 10 print(list_2)
>>>[['a', 'b'], 1, 2]
>>>[['aaa', 'b'], 1, 222]
深拷贝就比较直接了,就是很单纯的很粗暴的克隆一份数据出来自己玩,自己想咋作就咋作,跟别人无关。
4、拷贝的警告
1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。
2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。