python赋值,深拷贝和浅拷贝的区别
1.赋值
list1=[[1,2],'fei',66] list2=list1 list1 [[1, 2], 'fei', 66] list2 [[1, 2], 'fei', 66] list2.append(77) list2 [[1, 2], 'fei', 66, 77] list1 [[1, 2], 'fei', 66, 77] id(list1),id(list2) (72624608, 72624608)
总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加
2.浅拷贝
使用的方法:copy.copy()
代码示例:
>>> import copy >>> list1=[[1,2],'fei',66] >>> list2=copy.copy(list1) >>> print(id(list1)) 55713024 >>> print(id(list2)) 55712864 >>> print(id(list1[0]),'\n',id(list2[0])) 55712184 55712184 >>> print(id(list1[1]),'\n',id(list2[1])) 61987040 61987040 >>> print(id(list1[2]),'\n',id(list2[2])) 2057136240 2057136240 #总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的 >>>list1=[[1,2],'fei',66] >>> list2=copy.copy(list1) >>> list1 [[1, 2], 'fei', 66] >>> list2 [[1, 2], 'fei', 66] >>> list1[0][0]=11 >>> list1 [[11, 2], 'fei', 66] >>> list2 [[11, 2], 'fei', 66] >>> list1[1]='change' >>> list1 [[11, 2], 'change', 66] >>> list2 [[11, 2], 'fei', 66] #总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)
最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝)
3.深拷贝
使用的方法:copy.deepcopy()
代码示例:
>>> list1=[[1,2],'fei',66] >>> list3=copy.deepcopy(list1) >>> print(id(list1),'\n',id(list2)) 62055888 55713624 >>> print(id(list1[0]),'\n',id(list2[0])) 55726368 55713704 >>> print(id(list1[1]),'\n',id(list2[1])) 61987040 61987040 >>> print(id(list1[2]),'\n',id(list2[2])) 2057136240 2057136240 #总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样 >>> list1[0][0]=11 >>> list1 [[11, 2], 'fei', 66] >>> list3 [[1, 2], 'fei', 66] >>> list1[1]='change' >>> list1 [[11, 2], 'change', 66] >>> list3 [[1, 2], 'fei', 66] >>> id(list1[1]) 62058944 >>> id(list3[1]) 61987040 #总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化
最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)