第六章 浅拷贝与深拷贝
此篇的知识点如果理解了,对后续的学习有很好的帮助,请不熟悉的道友多看多练多思考。
1.概念
为什么要拷贝?
- 如果x和y指向的是一个可变对象,那么通过x修改后,在通过y访问到的数据也是变化后的。
2.直接赋值
在如下代码中,num2 = num1不是复制。是两个变量指向同一个列表,并且修改任何一个,都会影响另外一个。
# 直接赋值:两个变量指向同一个对象,修改其中一个,就会影响另一个(互相影响)。
num1 = [10, 20, 30, 40 ,50]
num2 = num1
num2[4] = [60]
print(num1[4]) # [60]
print(num2[4]) # [60]
image-202602121543458113.浅拷贝
浅拷贝会创建一个新的外层容器,但内部的元素仍然引用原来的对象。
import copy
# 浅拷贝:创建一个新的外层容器,但内部元素仍然引用原来的对象
num1 = [10, 20, 30, 40]
num2 = copy.copy(num1)
num2[3] = 90
print(num2[3]) # 90
print(num1[3]) # 40
image-20260212154903196浅拷贝存在的问题:嵌套数据仍然是共享的,修改嵌套数据会互相影响。
# 浅拷贝存在的问题:嵌套数据仍然是共享的,修改嵌套数据会互相影响
num1 = [10, 20, 30, [40, 50]]
num2 = copy.copy(num1)
num2[3][0] = 90
print(num2[3][0]) # 90
print(num1[3][0]) # 90
image-202602121552388814.深拷贝
创建一个新的外层容器,同时对内部所有可变对象进行递归复制(不可变对象不复制,继续引用)。
# 深拷贝:创建一个新的外层容器,并对其内部所有的【可变子对象】进行递归复制
# 备注:
# 1.深拷贝可以彻底消除数据之间的相互影响。
# 2.深拷贝遇到【不可变对象】不会复制,会直接引用。
num1 = [10, 20, 30, [40, 50]]
num2 = copy.deepcopy(num1)
num2[3][0] = 90
print(num2[3][0]) # 90
print(num1[3][0]) # 40
image-20260212155631354特点:
注意点:
# 注意点:
# 1.深拷贝只复制可变对象,不可变对象会直接引用。
a = 666
b = copy.deepcopy(a)
# 两个的内存地址是一样的
print(id(a)) # 1894113843504
print(id(b)) # 1894113843504
# 2.元组中如果只包含不可变对象,则深拷贝没有效果。
nums1 = (10, 20, 30, [40, 50])
nums2 = copy.deepcopy(nums1)
print(id(nums1)) # 1491916545120
print(id(nums2)) # 1491916544960
ps:橱窗有Python书籍,有需要的道友自行购买,让洒家赚一丢丢佣金吧。如果文章对您有帮助,我很荣信。