Python的浅拷贝和深拷贝

总结

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

参考:图解 Python 深拷贝和浅拷贝

1:对象的赋值

Python中,对象的赋值都是进行对象引用(内存地址)传递

will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = will

由于will和wilber指向同一个对象,所以对will的任何修改都会体现在wilber上

2:浅拷贝

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will)

浅拷贝会创建一个新的对象,这个例子中”wilber is not will”
但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”wilber[i] is will[i]”

当我们使用下面的操作的时候,会产生浅拷贝的效果:

使用切片[:]操作
使用工厂函数(如list/dir/set)
使用copy模块中的copy()函数

3:深拷贝

跟浅拷贝类似,深拷贝也会创建一个新的对象,这个例子中”wilber is not will”
但是,对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • is 和 ==什么区别? 在Python中 is 是用来判断两个对象的内存地址是否一样,而 == 号是判断两个对象...
    梦云之巅阅读 341评论 1 2
  • 在之前的一篇文章中,我们解释了一下为什么下面的两种方式是不同的: 第一种生成的bucket中每个list都是不同的...
    文哥的学习日记阅读 1,214评论 0 3
  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,937评论 0 5
  • 之前都是想看啥源码就直接搜grepcode上面的看看。最近闲了,就在看tcp ip相关,想着从user层一步步怎么...
    canezk阅读 1,784评论 0 0
  • 今天深切的领悟到一些原则上的问题,一旦投机,便会害了自己的一生
    echocorner阅读 213评论 0 0

友情链接更多精彩内容