深浅拷贝

深浅拷贝

浅拷贝

l1 = [1, 2, 3, [4, 5, 6]]
print(l1)
print(id(l1))
print(l1[3])
print(id(l1[3]))
#l2是通过l1浅拷贝而来的
l2 = l1.copy()
l1[3][0] = 444
print(l2)
print(id(l2))
print(l2[3])
print(id(l2[3]))
#最后打印在打印l1的内容,发现该列表中的值随着l2的改变也改变了
print(l1)
print(id(l1))
#输出结果为
[1, 2, 3, [4, 5, 6]]
2799837795400
[4, 5, 6]
2799837794888
[1, 2, 3, [444, 5, 6]]
2799838353416
[444, 5, 6]
2799837794888
[1, 2, 3, [444, 5, 6]]
2799837795400
#可以看出在浅拷贝中一个列表中的嵌套列表的值改变之后,另一个列表会相应的改变!因为它们嵌套的列表使用的是同一内存地址

深拷贝

在编写深拷贝程序时要用到deepcopy函数,但是需要引入copy模块!

1、浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)
2、经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了

#导入copy库
import copy
l1 = [1, 2, 3, [4, 5, 6]]
print(l1)
print(id(l1))
print(l1[3])
print(id(l1[3]))
#l2是通过l1深拷贝而来的
l2 = copy.deepcopy(l1)
l2[3][0] = 444
print(l2)
print(id(l2))
print(l2[3])
print(id(l2[3]))
#最后打印在打印l1的内容,发现该列表中的值并没有变化
print(l1)
print(id(l1))
#输出的结果为
[1, 2, 3, [4, 5, 6]]
2418495986184
[4, 5, 6]
2418495986248
[1, 2, 3, [444, 5, 6]]
2418495986504
[444, 5, 6]
2418464576776
[1, 2, 3, [4, 5, 6]]
2418495986184
#可以看出深拷贝和浅拷贝不一样之处在于对于嵌套的引用部分会独自分配内存!
原文地址:https://www.cnblogs.com/a736659557/p/11892333.html