浅拷贝与深拷贝

📅 2026/7/22 10:12:25
浅拷贝与深拷贝
C深浅拷贝与Python的区别C分浅拷贝 / 深拷贝是针对堆内存裸指针根源是手动管理内存new/delete不处理会内存重复释放崩溃Python没有指针、不用手动管内存浅 / 深拷贝是针对可变嵌套对象列表、字典、自定义类实例问题不是内存崩溃而是修改一个另一个跟着变。Python的深浅拷贝主要是用来解决两个对象之间相互影响的问题。直接赋值两个变量指向同一个对象(可变对象)修改其中一个会互相影响。# 直接赋值 nums1 [1, 2, 3] nums2 nums1 print(id(nums1))#2217372066944 print(id(nums2))#2217372066944 nums1[2] 99 print(nums1[2])#99创建nums1赋值给nums2。修改nums[3]的值改为99。解决互相影响的问题可以通过浅拷贝和深拷贝来解决。浅拷贝创建一个新的外层容器但内部元素仍然引用原来的对象。#浅拷贝 import copy nums1 [10, 20, 30, 40] #将nums1浅拷贝赋值黑nums2 nums2 copy.copy(nums1) print(id(nums1))#2590498906368 print(id(nums2))#2590499054720 nums2[3] 99 print(nums1[3])#40 print(nums2[3])#99将nums1进行浅拷贝赋值给nums2。将nums2[3]值修改为99并不会影响nums1[3]。浅拷贝存在的问题嵌套的数据(可变对象)仍然是共享的修改嵌套的数据还是会互相影响。import copy nums1 [10, 20, 30, [40, 50]] nums2 copy.copy(nums1) #地址相同 print(id(nums1[3]))#1516985737472 print(id(nums2[3]))#1516985737472 nums2[3][0] 99 print(nums1[3][0])#99将nums2[3][0]的值修改为99。解决浅拷贝存在的问题使用深拷贝。如果修改的是不可变对象不会存在上面的问题因为会在堆上新创建一个不可变对象然后指向它。深拷贝创建一个新的外层容器并对其内部所有的可变对象进行递归赋值。import copy nums1 [10, 20, 30, [40, 50]] nums2 copy.deepcopy(nums1) # 地址不同 print(id(nums1[3]))#2270013186304 print(id(nums2[3]))#2270013995520 nums2[3][0] 99 print(nums1[3][0])#40 print(nums2[3][0])#99将nums1进行深拷贝赋值给nums2。修改nums[3][0]的值为99。备注深拷贝可以彻底消除数据之间的相互影响。深拷贝遇到【不可变对象】不会复制会直接引用。注意点深拷贝只复制可变对象不可变对象会直接引用。元组中如果只包含不可变对象则深拷贝没有效果。import copy nums1 (10, 20, 30, (40, 50)) nums2 copy.deepcopy(nums1) #地址相同 print(id(nums1))#2022183010768 print(id(nums2))#2022183010768 nums3 (10, 20, 30, [40, 50]) nums4 copy.deepcopy(nums3) #地址不同 print(id(nums3))#2022182910320 print(id(nums4))#2022182910160