可变和不可变类型
- 可变数据类型: 堆区的值改变了,但是值对应的id不变,容器类型的数据都是可变类型的,如:list、dict
- 不可变类型: 堆区的值改变了,值对应的id也发生了改变,如:int、floating、str、bool
a = {"name":"lzz","age":24,"lover":"everyone"}
print(id(a))
a["name"]="leo"
print(a,id(a))
注意: 字典的key必须为不可变类型,否则报错,value可以是任意类型
深浅拷贝
浅拷贝
不区分数据的类型,直接将索引对应的内存地址拷贝进来,相当于只拷贝了一层,对于可变类型的数据,原数据和拷贝的数据是分不开的。
list1=["lzz",234,[1,2]]
list2=list1.copy()
list1[2][0]="xin" #原数据和拷贝的数据都会发生变化
print(list1,list2)
print(id(list1[0]),id(list1[1]),id(list2[2]),id(list1[2][0]),id(list1[2][1]))
print(id(list2[0]),id(list2[1]),id(list2[2]),id(list2[2][0]),id(list2[2][1]))
深拷贝
区分数据类型,会将不可变类型的数据对应的到内存地址拷贝过来。会产生新的内存地址指向可变类型的数据。因为区分了可变类型和不可变类型,所以原数据和拷贝的数据之间是互不影响的。
import copy
list1=["lzz",234,[1,2]]
list2=copy.deepcopy(list1)
list1[2][0]="xin" #原数据发生了改变,但是拷贝的数据不受影响
print(list1,list2)
print(id(list1[0]),id(list1[1]),id(list2[2]),id(list1[2][0]),id(list1[2][1]))
print(id(list2[0]),id(list2[1]),id(list2[2]),id(list2[2][0]),id(list2[2][1]))