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、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

原文地址:https://www.cnblogs.com/Adairye/p/8570929.html