💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**问:说说Python中深拷贝与浅拷贝的区别?** **答:**Python中如果需要拷贝对象,需要使用标准库中的copy模块。而说到copy模块,不得不说的就是深拷贝与浅拷贝。 深拷贝和浅拷贝需要注意的地方就是:**可变元素的拷贝** 在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的。 也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别 。 ## **浅拷贝**----list2 = copy.copy(list1); 使用copy模块里面的copy方法实现。 改变原始对象中为**可变类型**的元素的值,会同时影响拷贝对象; 改变原始对象中为**不可变类型**的元素的值,不会响拷贝对象。 ```python import copy list1 = [[1,2], 'fei', 66]; // 定义一个列表,其中第一个元素是可变类型。 list2 = copy.copy(list1); // 进行浅copy #对象地址是否相同。 ----#结果:不同 print(id(list1)); #46177816 print(id(list2)); #46177936 #第一个元素地址是否相同。 ----#结果:相同 print(id(list1[0])); #46240432 print(id(list2[0])); #46240432 #第二个元素地址是否相同。 ----#结果:相同 print(id(list1[1])); #45547328 print(id(list2[1])); #45547328 #改变第一个值,查看复制对象变化。 ----#结果:复制对象发生变化 list1[0][0] = 2; print(list2); #[[2, 2], 'fei', 66] #改变第二个值,查看复制对象变化。 -----#结果:复制对象没发生变了 list1[1] = 'ge'; print(list2); #[[2, 2], 'fei', 66] ``` ## **深拷贝**---list2 = copy.deepcopy(list1); copy模块里面的deepcopy方法实现。 深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。 原始对象和拷贝对象所有的可变元素地址都不一样了。 **Python深浅拷贝总结:** 1,深浅拷贝都是对源对象的复制,占用不同的内存空间。 2,不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。 3,可变类型的对象:值相等,地址不相等 。 ``` import copy #定义一个列表,其中第一个元素是可变类型。 list1 = [[1,2], 'fei', 66]; #进行深copy list2 = copy.deepcopy(list1); #对象地址是否相同。 print(id(list1)); print(id(list2)); #结果:不同 46177816 46177936 #第一个元素地址是否相同。 print(id(list1[0])); print(id(list2[0])); #结果:不同 49123856 49588784 #第二个元素地址是否相同。 print(id(list1[1])); print(id(list2[1])); #结果:相同 45547328 45547328 #改变第一个值,查看复制对象变化。 list1[0][0] = 2; print(list2); #结果:复制对象没发生变了 [[1, 2], 'fei', 66] #改变第二个值,查看复制对象变化。 list1[1] = 'ge'; print(list2); #结果:复制对象没发生变了 [[1, 2], 'fei', 66] ``` ## Python里的拷贝 引用和copy(),deepcopy()的区别 ~~~python import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print 'a = ', a print 'b = ', b print 'c = ', c print 'd = ', d 输出结果: a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] c = [1, 2, 3, 4, ['a', 'b', 'c']] d = [1, 2, 3, 4, ['a', 'b']] ~~~