1.前言赋值操作:a=1#内存会为1创建一个数据单元,然后让变量a指向这个数据单元print(id(a))#940417552a=2#内存会重新创建一个数据单元对于2,让变量a指向一个新的数据单元print(id(a))#1940417584list1=[1,2,3,4]print(id(list1))list1[0]=11print(id(list1))#创建一个新的变量赋值给原来的变量;a=1b=1c=alist1=[1,2,3]list2=lis1print(id(a),id(b),id(c))print(id(list1),id(list2))//输出结果:内存地址没有改变。其实这个方法类似于变量alias186039809618603980961860398096257030811047225703081104722浅拷贝分析代码:importcopya=[1,"2",[3,4]]b=copy.copy(a)print(id(a),id(b))#内存地址改变指令创建一个新对象print(id(index)forindexina)print(id(index)forindexinb)#引用对象b[0]中的原始元素="a"print(a,b)#修改不可变对象,会重新创建一个新对象,对源对象没有影响b[2][0]="A"print(a,b)#修改变量对象,直接修改元素的值,会影响原对象//输出结果:24538781635282453879464584at0x0000023B5687EF68>at0x0000023B5687EF68>[1,'2',[3,4]]['a','2',[3,4]][1,'2',['A',4]]['a','2',['A',4]]浅拷贝总结:1.浅拷贝会创建一个新的列表对象,但是对于列表中的元素,浅拷贝使用的是ori的引用ginal元素(内存地址)2.改变浅拷贝对象中的元素。如果元素是不可变对象,将创建一个新对象(不影响原始元素);如果是可变对象,则不会创建新对象,直接修改(响应原始元素)3.深拷贝分析代码:importcopya=[1,"2",[3,4]]b=copy.deepcopy(a)print(id(a),id(b))#内存地址更改指令创建新对象print(id(index)forindexina)print(id(index)forindexinb)#引用对象中的原始元素;但对于可变对象,将创建新对象print(id(a[2]),id(b[2]))#15997022857041599702270344b[0]="a"print(a,b)#修改不可变对象将重新创建一个新的对象,对源对象没有影响b[2][0]="A"#修改变量对象,直接修改元素的值,对原对象没有影响print(a,b)//输出结果:25356159734482535617299080at0x0000024E5E7C1F10>at0x0000024E5E7C1F10>[1,'2',[3,4]]['a','2',[3,4]][1,'2',[3,4]]['a','2',['A',4]]深拷贝总结:1.深拷贝创建的列表对象,对于列表中的元素,如果是不可变对象,会引用原来的元素,如果是可变对象,会创建一个新的对象2.要改变深拷贝中的元素,如果是一个不可变对象,会创建一个新对象(不影响原有元素),如果是可变对象,则不会创建新对象t被创建,它会被直接修改(不影响原始元素)——因为在复制阶段为一个可变对象创建了一个新对象