为什么要复制
。在对变量进行调试的时候我们常常希望对某些代码进行调试但是又不希望对原先的代码进行影响那么就可以进行复制,但是在python中经常会遇到明明复制了但是原先的变量还是会改变。这就涉及深浅复制
什么是深浅复制
从字面上来理解深就是全面具体,浅就是片面。从计算机上来理解,复制就是把原先的数据重构一个地方拷贝到另一个地方,深复制就是计算机开辟一个新的空间来储存你复制的这个数据,并且对原先的数据不会有任何影响,浅复制就是指向原先数据所在的位置,复制的数据更改那么源数据也会被更改
python中用于复制的有copy,deepcopy
上代码
a=[1,2,3,4,5,6]
b=a
print(a)
print(b)
a=[2,3,4,5,6,7]
print(a)
print(b)
"""
#运行结果
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6]
"""
#好像是复制成功了
"""
物品比喻:
一个物品是[1,2,3,4,5,6]这个列表
上面有a这个标签,然后我又把b这个标签贴在这个物品上所以会有两个一样的打印
到那时我把a这个标签贴在另一个物体上,但是b并没有改变。
所以会有a是另外的一个列表,而b没有改变
"""
a=[1,2,3,4]
b=a
print(a)
print(b)
a[0],a[1],a[2],a[3]=7,8,9,10
print(a)
print(b)
"""
#运行结果
[1, 2, 3, 4]
[1, 2, 3, 4]
[7, 8, 9, 10]
[7, 8, 9, 10]
"""
#像这样并没有把a撕下,是把物品的组成换了
#更形象一点,把一个物体[1,2,3,4,5,6]放在桌子上,然后我的a,b都在这个桌子上,所以我打印的都是桌子#上的这个物品,但是我把a这个标签贴在茶几上,茶几上有[2,3,4,5,6,7]这个物品所以会有两个打印结果。
#但是如果我的ab标签都在桌子上,但是我把[1,2,3,,4,5,6]这个物品换了,不管是ab答应的欧式这个新的物
#品
import copy
#copy.copy
#copy.deepcopy
a=[1,2,3]
b=copy.copy(a)
print(a)
print(b)
#对a进行更改
a=[2,3,4,5]
print(a)
print(b)
a[0],a[1],a[2]=2,3,4
print(a)
print(b)
"""
[1, 2, 3]
[1, 2, 3]
[2, 3, 4, 5]
[1, 2, 3]
[2, 3, 4, 5]
[1, 2, 3]
"""
#?
#进行copy是似乎就是深复制了,那deppcopy呢?
import copy
a=[1,2,3]
b=copy.deepcopy(a)
print(a)
print(b)
#对a进行更改
a=[2,3,4,5]
print(a)
print(b)
a[0],a[1],a[2]=2,3,4
print(a)
print(b)
#好像没什么用
"""
#对于这一个数据类型好像没用,等号就是浅复制,copy和deepcopy没有区别
#但是好像python不止这一个数据类型,试试列表的更深层操作,列表嵌套?
"""
a=[1,2,3,[4,5,6]]
b=a
print(a)
print(b)
a=[2,3,4,[5,6,7]]
print(a)
print(b)
#好像深复制了?
#那我们尝试把a的每个元素都更改试试
a[0],a[1],a[2],a[3]=4,5,6,[7,8,9]
print(a)
print(b)
"""
运行结果
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6]]
[2, 3, 4, [5, 6, 7]]
[1, 2, 3, [4, 5, 6]]
[4, 5, 6, [7, 8, 9]]
[1, 2, 3, [4, 5, 6]]
#咦,好像盒子不合适了?
#那是哪里出问题了?
#把换盒子的地方注释掉试试?
"""
=[1,2,3,[4,5,6]]
b=a
print(a)
print(b)
a[0],a[1],a[2],a[3]=4,5,6,[7,8,9]
print(a)
print(b)
"""
运行结果
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6]]
[4, 5, 6, [7, 8, 9]]
[4, 5, 6, [7, 8, 9]]
#这~,原来是把盒子都换了。怎么会有效果。相当于你都深复制了在进行浅复制和另外的盒子当然没有关系
"""
#这样好像看的不太明显,试试多重嵌套?
import copy
a=[1,2,3,[4,5,[6]]]
b=copy.copy(a)
print(a)
print(b)
a=[2,3,4,[5,6,[7]]]
print(a)
print(b)
#怎么没效果啊?
a[0],a[1],a[2],a[3][0],a[3][1],a[3][2][0]=7,8,9,10,11,12
print(a)
print(b)
"""
运行结果
[1, 2, 3, [4, 5, [6]]]
[1, 2, 3, [4, 5, [6]]]
[2, 3, 4, [5, 6, [7]]]
[1, 2, 3, [4, 5, [6]]]
[7, 8, 9, [10, 11, [12]]]
[1, 2, 3, [4, 5, [6]]]
#好像有点不对
"""
import copy
a=[1,2,3,[4,5,[6]]]
b=copy.copy(a)
print(a)
print(b)
a=[2,3,4,[5,6,[7]]]
print(a)
print(b)
b[0],b[1],b[2],b[3][0],b[3][1],b[3][2][0]=7,8,9,10,11,12
print(a)
print(b)
"""
[1, 2, 3, [4, 5, [6]]]
[1, 2, 3, [4, 5, [6]]]
[2, 3, 4, [5, 6, [7]]]
[1, 2, 3, [4, 5, [6]]]
[2, 3, 4, [5, 6, [7]]]
[7, 8, 9, [10, 11, [12]]]
咦,好像又对了,那试试deepcopy的深复制?
"""
import copy
a=[1,2,3,[4,5,[6]]]
b=copy.deepcopy(a)
print(a)
print(b)
a=[2,3,4,[5,6,[7]]]
print(a)
print(b)
b[0],b[1],b[2],b[3][0],b[3][1],b[3][2][0]=7,8,9,10,11,12
print(a)
print(b)
"""
[1, 2, 3, [4, 5, [6]]]
[1, 2, 3, [4, 5, [6]]]
[2, 3, 4, [5, 6, [7]]]
[1, 2, 3, [4, 5, [6]]]
[2, 3, 4, [5, 6, [7]]]
[7, 8, 9, [10, 11, [12]]]
这好像好像才是我们想要的,复制后的修改后与原来的没有任何关系
"""
总结:
深浅复制分为两种情况,列表嵌套和一般的。
一般的:=就相当于浅复制,而copy和deepcopy没有区别
列表嵌套:=,copy相当于浅深复制(最外面的列表被深复制,但是里面的列表是浅复制被更改后源码也会被更改),deepcopy相当于深复制,源码与复制后的代码没有关联
纯萌新,一起交流学习