Python之深浅拷贝详解
1、浅拷贝原理
浅拷贝解释:
是把原列表第一层的内存地址拷贝一份给新列表。对于不可变类型拷贝本身id内存地址给新列表(原列表修改不可变类型的值,新列表不会变),对于可变类型是拷贝可变类型容器本身的id给新列表(原列表修改其中内嵌可变类型的元素值,新列表也会变)
原理图:
实例:
list=['jesse','zhangsan',['786', '2.23']] list1=list.copy() print(list) print(list1) print("原列表id:",id(list)) print("拷贝的列表id:",id(list1)) print("原列表内嵌列表id:",id(list[2])) print("拷贝的列表内嵌列表id:",id(list1[2])) list[0]='jc' list[2][0]='yuanyuan' print(list) print(list1) print("原列表id:",id(list)) print("拷贝的列表id:",id(list1)) print("原列表内嵌列表id:",id(list[2])) print("拷贝的列表内嵌列表id:",id(list1[2])) # 执行结果 ['jesse', 'zhangsan', ['786', '2.23']] ['jesse', 'zhangsan', ['786', '2.23']] 原列表id: 2557709542024 拷贝的列表id: 2557710045576 原列表内嵌列表id: 2557709541960 拷贝的列表内嵌列表id: 2557709541960 ['jc', 'zhangsan', ['yuanyuan', '2.23']] ['jesse', 'zhangsan', ['yuanyuan', '2.23']] 原列表id: 2557709542024 拷贝的列表id: 2557710045576 原列表内嵌列表id: 2557709541960 拷贝的列表内嵌列表id: 2557709541960
2、深拷贝原理:
深拷贝:
在拷贝时区分原列表可变和不可变类型,对于不可变类型直接将其值的id及内存地址复制给新的列表,对于可变类型则重新生成一个容器id。(多层嵌套也是如此)
原理图:
实例:
import copy list=['jesse','zhangsan',['786', '2.23']] list1=copy.deepcopy(list) print(list) print(list1) print("原列表id:",id(list)) print("拷贝的列表id:",id(list1)) print("原列表内嵌列表id:",id(list[2])) print("拷贝的列表内嵌列表id:",id(list1[2])) list[0]='jc' list[2][0]='yuanyuan' print(list) print(list1) print("原列表id:",id(list)) print("拷贝的列表id:",id(list1)) print("原列表内嵌列表id:",id(list[2])) print("拷贝的列表内嵌列表id:",id(list1[2])) # 执行结果 ['jesse', 'zhangsan', ['786', '2.23']] ['jesse', 'zhangsan', ['786', '2.23']] 原列表id: 2715253531272 拷贝的列表id: 2715253636040 原列表内嵌列表id: 2715253532488 拷贝的列表内嵌列表id: 2715253636104 ['jc', 'zhangsan', ['yuanyuan', '2.23']] ['jesse', 'zhangsan', ['786', '2.23']] 原列表id: 2715253531272 拷贝的列表id: 2715253636040 原列表内嵌列表id: 2715253532488 拷贝的列表内嵌列表id: 2715253636104