美文网首页
Python底层|赋值 浅拷贝 深拷贝

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

作者: 蓝白绛 | 来源:发表于2019-02-05 20:03 被阅读0次

参考

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中的引用赋值,深拷贝,浅拷贝

    摘要:Python,引用赋值,深拷贝,浅拷贝 总结一下Python中的变量的引用赋值,深拷贝和浅拷贝,先上结论 赋...

  • 简介深浅拷贝

    深浅拷贝 python 直接赋值,浅拷贝和深拷贝 直接赋值 其实就是对象的引用 (可以理解成浅拷贝) 浅拷贝: 拷...

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

    参考 python中的深拷贝和浅拷贝问题python的复制,深拷贝和浅拷贝的区别 结论 总体来说,赋值只是增加了一...

  • python深拷贝和浅拷贝详解

    对于python来说,有两种拷贝类型,浅拷贝和深拷贝 但要注意的是= 不是浅拷贝也不是深拷贝,赋值是新建了一个引用...

  • Python中的赋值及深浅拷贝

    Python中的赋值及深浅拷贝 赋值 示例 打印 浅拷贝 示例 打印 深拷贝 示例 打印 三层列表演示 示例 打印

  • python的浅拷贝和深拷贝

    对于不可变类型,浅拷贝和深拷贝没有区别 对于不可变类型 赋值 浅拷贝 深拷贝

  • 深拷贝 浅拷贝

    深入认识深拷贝 浅拷贝 公共方法 // 深拷贝 浅拷贝 对于基本类型来说 对于赋值操作 就是 深拷贝 因为值...

  • copy见解

    拷贝就是拷贝,何来深浅之说? Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,...

  • python赋值、浅拷贝、深拷贝

    赋值:相当于c的指针。修改了其中一个变量,另一个跟着改变。注意对不可变对象,新赋值,就是修改了指向。(int、字符...

  • python赋值、浅拷贝、深拷贝

    面试遇到了深拷贝、浅拷贝问题,由于平时总是注重实现功能,而忽略了一些基础原理,对其理解很模糊。所以决定脚踏实地好好...

网友评论

      本文标题:Python底层|赋值 浅拷贝 深拷贝

      本文链接:https://www.haomeiwen.com/subject/pgllsqtx.html