参考
python中的深拷贝和浅拷贝问题
python的复制,深拷贝和浅拷贝的区别
结论
总体来说,赋值只是增加了一个对象的引用,它们指向内存中的同一个对象;浅拷贝会开辟新内存将对象拷贝一份,但是不会拷贝子对象;深拷贝会开辟新内存将对象拷贝后,连带子对象也拷贝,与原对象完全独立。
示意图
代码示意
1、赋值
>>> a = [1,2,3,[4,5]]
>>> b = a # 通常的赋值操作
>>> a
[1, 2, 3, [4, 5]]
>>> b
[1, 2, 3, [4, 5]]
>>> b[0] = 111 # 将b[0]由1变为111
>>> a # 结果显示a[0]和b[0]一起都改变了
[111, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 5]]
>>> b[3][1] = 444 # 将b[3][1]由5变为444
>>> a
[111, 2, 3, [4, 444]] # 结果依然是a[3][1]和b[3][1]一起都改变了
>>> b
[111, 2, 3, [4, 444]]
从上述代码中可以看出:这里只是传递对象的引用而已,a和b指向的是同一个对象。原始列表改变,被赋值的b也会做相同的改变。
2、浅拷贝
>>> import copy
>>> a = [1,2,3,[4,5]]
>>> b = copy.copy(a)# b为a的浅拷贝
>>> a
[1, 2, 3, [4, 5]]
>>> b
[1, 2, 3, [4, 5]]
>>> b[0]=111 # 将b[0]由1变为111
>>> a # 结果显示a[0]并没有变,但b[0]变成了111
[1, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 5]]
>>> b[3][1]=444 # 将b[3][1]由5变为444
>>> a # 结果显示a[3][1]和b[3][1]都变了
[1, 2, 3, [4, 444]]
>>> b
[111, 2, 3, [4, 444]]
从上述代码中可以看出:b指向的是a的浅拷贝对象,没有拷贝子对象,所以a和b的子对象是相同的引用。如果我们改变b中的对象,对a不会造成影响;如果改变了b的子对象,则a和b对应的子对象都会改变。
3、深拷贝
>>> import copy
>>> a = [1,2,3,[4,5]]
>>> b = copy.deepcopy(a)# b为a的深拷贝
>>> a
[1, 2, 3, [4, 5]]
>>> b
[1, 2, 3, [4, 5]]
>>> b[0]=111 # 将b[0]由1变为111
>>> a # 结果显示a[0]没有变,b[0]变为111,与浅拷贝结果一样
[1, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 5]]
>>> b[3][1]=444 # 将b[3][1]由5变为444
>>> a # 结果显示a[3][1]没变,b[3][1]都变为444,与浅拷贝结果不一样
[1, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 444]]
从上述代码可以看出:两个对象 a 和 b 相互独立。b指向a的深拷贝对象,包含a中的子对象的拷贝,所以对b进行改变不会造成a中任何元素的改变。
结尾
如果您发现我的文章有任何错误,或对我的文章有什么好的建议,请联系我!如果您喜欢我的文章,请点喜欢~*我是蓝白绛,感谢你的阅读!