文章目录
- 0、先说结论
- 1、浅拷贝修改元素值
- 2、深拷贝修改元素值
- 学习链接
0、先说结论
无论深拷贝还是浅拷贝都会为新对象分配一块新的内存,因此新老对象id不相同。
对于浅拷贝,新老对象内部的可变and不可变元素id都是相同的(在没修改元素值之前)。
对于深拷贝,新老对象内部的可变元素id不相同、不可变元素id相同(在没修改元素值之前)。
1、浅拷贝修改元素值
★重点★:浅拷贝下修改了a对象内元素的值,b对象内元素的值是否发生变化,取决于被修改的值是否是可变对象。
【情况一】:如果修改的元素是可变对象,那么修改了a内元素,b内元素会发生变化,该元素在a、b内的id仍然相同;
【情况二】:如果修改的元素是不可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id将不再相同(由相同变为不相同)。
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a) # 浅拷贝
# 新老对象id不相同
print(id(a)) # 输出结果:140616167615944
print(id(b)) # 输出结果:140616167644104
# 可变对象id相同
print(id(a[2])) # 输出结果:140615967617352
print(id(b[2])) # 输出结果:140615967617352
# 不可变对象id相同
print(id(a[1])) # 输出结果:140651006928832
print(id(b[1])) # 输出结果:140651006928832
# 情况1举例:修改的元素是可变对象
a[2][1] = 5 # 修改a中[3, 4]元素,将4修改为5
print(a) # 打印结果:[1, 2, [3, 5]]
print(b) # 打印结果:[1, 2, [3, 5]]
# 可变对象id依然相同
print(id(a[2])) # 打印结果:140615967617352
print(id(b[2])) # 打印结果:140615967617352
# 情况2举例:修改的元素是不可变对象
a[1] = 4 # 修改a中第1个位置上的元素,即将2修改为4
print(a) # 打印结果:[1, 4, [3, 5]]
print(b) # 打印结果:[1, 2, [3, 5]]
# 不可变对象id不相同
print(id(a[1])) # 打印结果:140467457144832
print(id(b[1])) # 打印结果:140467457144768
2、深拷贝修改元素值
★重点★:深拷贝下修改了a对象内元素的值,b对象内元素的值是否发生变化,取决于被修改的值是否是可变对象。
【情况一】:如果修改的元素是可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id仍然不相同;
【情况二】:如果修改的元素是不可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id将不再相同(由相同变为不相同)。
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a) # 深拷贝
# 新老对象id不相同
print(id(a)) # 输出结果:139687452818888
print(id(b)) # 输出结果:139687452847048
# 可变对象id不相同
print(id(a[2])) # 输出结果:139687252566408
print(id(b[2])) # 输出结果:139687252566152
# 不可变对象id相同
print(id(a[1])) # 输出结果:140442278533056
print(id(b[1])) # 输出结果:140442278533056
# 情况1举例:修改的元素是可变对象
a[2][0] = 4 # 修改a中[3, 4]元素,将3修改为4
print(a) # 打印结果:[1, 2, [4, 4]]
print(b) # 打印结果:[1, 2, [3, 4]]
# 可变对象id不相同
print(id(a[2])) # 打印结果:139687252566408
print(id(b[2])) # 打印结果:139687252566152
# 情况2举例:修改的元素是不可变对象
a[1] = 4 # 修改a中第1个位置上的元素,即将2修改为4
print(a) # 打印结果:[1, 4, [4, 4]]
print(b) # 打印结果:[1, 2, [3, 4]]
# 不可变对象id不相同
print(id(a[1])) # 打印结果:140467457144832
print(id(b[1])) # 打印结果:140442278533056
学习链接
https://blog.csdn.net/weixin_44244190/article/details/129249875