# 可变: list ,dict ,set(集合) # 不可变: int bool str tuple
# 有序: list,tuple,str,int,bool # 无序: dict(python3.6以后可以是有序的了),set
# 取值方式: # 索引: str list tuple # 直接: set ,int ,bool # 键: dict
注意:‘is‘和‘==‘
‘==‘只比较值是否一样
‘is‘不仅比较值一样还要比较内存地址是否一样
import copy lst1=[1,2,3] lst2=copy.copy(lst1)#浅拷贝 lst3=copy.deepcopy(lst1)#深拷贝 lst4=lst1 #赋值
定义:
浅拷贝只拷贝第一层(如果有列表嵌套,他会复制那一个索引位置的列表的内存地址,而那个列表内的数据不会复制,说白了就是共用内部的list,最外层的list是自己新建的)
可变类型拷贝,不可变类型共用(列表嵌套时,内层的列表地址不会复制,因为list是可变的,他是自己创个内部的list,然后共用list内的不可变元素的地址)
其实深拷贝不可变元素时也应该重新创建内存,来访对应的不可变元素,因为小数据池的关系所以就没新开辟地址.
注:
如果发生了拷贝,内存地址一定发生变化,说白了拷贝就是自己新建地址,放复制过来的内容.
如下图:深浅拷贝如果只拷贝一个单一的列表(列表内不包含字典列表等可变元素)的情况下,深浅拷贝效果都一样:

再看代码:
#如果只是单一列表,深浅拷贝都一样 import copy lst1=[1,2,3] lst2=copy.copy(lst1)#浅拷贝 lst3=copy.deepcopy(lst1)#深拷贝 print(id(lst1),id(lst2),id(lst3))#列表地址新建,全都不一样 # 44954968 44957408 44990712 print(id(lst1[1]) , id(lst2[1]) , id(lst3[1]))#内部不可变元素全都共用 # 496100128 496100128 496100128
重点(这里要着重理解):
列表内部加了列表后(深浅拷贝就不一样了):

看代码:
#如果列表套列表,深浅拷贝大不一样了 import copy lst1=[1,2,3,[4,5,6,[7,8,9]]] lst2=copy.copy(lst1)#浅拷贝 lst3=copy.deepcopy(lst1)#深拷贝 print(id(lst1),id(lst2),id(lst3))#地址新建,全都不一样 # 44954968 44957408 44990712 print(id(lst1[1]) , id(lst2[1]) , id(lst3[1]))#内部不可变元素全都共用 # 496100128 496100128 496100128 # 看内部列表 print(id(lst1[3]) , id(lst2[3]) , id(lst3[3]))#深拷贝是自己建的所以不一样,浅拷贝是共用的 # 52295000 52295000 52330984 # 看内部列表的内部元素 print(id(lst1[3][0]) , id(lst2[3][0]) , id(lst3[3][0]))#4是不可变元素,共用 # 496296768 496296768 496296768 # 看内部列表再套的列表 print(id(lst1[3][3]) , id(lst2[3][3]) , id(lst3[3][3]))#还是只有深拷贝自己建(因为列表不管在哪都是可变元素),浅拷贝共用 # 44758360 44758360 44796584 print(id(lst1[3][3][1]) , id(lst2[3][3][1]) , id(lst3[3][3][1]))#里面的不可变元素8还是共用的 # 493675392 493675392 493675392
如果单一元组深浅拷贝就都一样:
import copy v1=(1,2,3) v2=copy.copy(v1)#浅拷贝 v3=copy.deepcopy(v1)#深拷贝 print(id(v1[1]),id(v2[1]),id(v3[1]))#内部不可变元素都是一样的 # 501474080 501474080 501474080 print(id(v1),id(v2),id(v3))#浅拷贝只是单一元组,深浅拷贝都一样,因为里面都是不可变元素,元组也不可变 # 47061912 47061912 47061912 copy.copy(v)=copy.deepcopy(v) #单一元组时深浅拷贝都一样
如果元组里有列表:
import copy v1=(1,2,3,[4,5,6]) v2=copy.copy(v1)#浅拷贝 v3=copy.deepcopy(v1)#深拷贝 print(id(v1),id(v2),id(v3))#浅拷贝不变,深拷贝会变,因为里面多了不可变元素,深拷贝要变的 # 18215728 18215728 48191024 print(id(v1[1]),id(v2[1]),id(v3[1]))#内部不可变元素都是一样的 # 501474080 501474080 501474080 print(id(v1[3]),id(v2[3]),id(v3[3]))#内部列表已经不同地址了所以元组也变了 # 51377496 51377496 51413360 元组套列表(元组里面都是不可变元素,都不变,怎么拷贝都一样,如果元组里面有可变元素,例如列表,此时深拷贝会变,浅拷贝没事,和原来一样) 浅拷贝不变 深拷贝变了,因为深拷贝中不可变元素不会共用
原文:https://www.cnblogs.com/shengjunqiye/p/12808211.html