Python底层|赋值 浅拷贝 深拷贝

参考

python中的深拷贝和浅拷贝问题
python的复制,深拷贝和浅拷贝的区别

结论

总体来说,赋值只是增加了一个对象的引用,它们指向内存中的同一个对象;浅拷贝会开辟新内存将对象拷贝一份,但是不会拷贝子对象;深拷贝会开辟新内存将对象拷贝后,连带子对象也拷贝,与原对象完全独立。

示意图

python赋值、浅拷贝、深拷贝.jpg

代码示意

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中任何元素的改变。

结尾

如果您发现我的文章有任何错误,或对我的文章有什么好的建议,请联系我!如果您喜欢我的文章,请点喜欢~*我是蓝白绛,感谢你的阅读!

你可能感兴趣的:(Python底层|赋值 浅拷贝 深拷贝)