Python 之 copy() 与 deepcopy() 之间的区别
在 Python 之中,如果想要复制一个对象就免不了要理解浅复制与深复制。这也是 Python 与其他语言的区别之一。
Python 的数据存储方式与其他语言不同。当你定义了一个变量:
a = [, , , , ]
这在 Python 中就表示在内存中开辟了一个空间,这个空间里存储了[0, 1, 2, 3, 4],然后变量a里存储这个内存空间的地址。
>>> a=[0, 1, 2, 3, 4]
>>> b = a
>>> print(b)
[0, 1, 2, 3, 4]
>>> a = [1]
>>> print(a)
[1]
>>> print(b)
[0, 1, 2, 3, 4]
这里我们可以清楚的看到,b = a 相当于在 b 中存储了当前 a 中记录的内存地址。当 a = [1] 时 Python 解释器又在内存中开辟了一个空间存储 [1] 并且在 a 中存储了它的地址。
但是整个过程中 b 依然存储了当初的 [0, 1, 2, 3, 4] 的存储地址,所以 b 的内容不变。
>>> a = [0, 1, 2, 3, 4]
>>> b = a
>>> a[0] = 99999
>>> print(a)
[99999, 1, 2, 3, 4]
>>> print(b)
[99999, 1, 2, 3, 4]
这里我修改了 a[0] 的值,相当于修改了在内存中存储的值,a 与 b 存储着一样的地址,当里面的内容改变时,自然输出的值也都改变了。
Python 中的浅复制与深复制:
理解了 Python 中的变量存储方式,我们再来说什么是浅复制与深复制。
>>> import copy
>>> a = [0, 1, 2, 3, 4]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> a[0] = 10086
>>> print(b)
[0, 1, 2, 3, 4]
>>> print(c)
[0, 1, 2, 3, 4]
>>> print(a)
[10086, 1, 2, 3, 4]
可以看到,当 a 时一个简单的字典、元祖、列表时,使用浅复制或深复制时修改 a 的值都不会使复制的对象值发生变化。
>>> import copy
>>> a = [0, 1, 2, [0, 1]]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> a[3][0] = 10086
>>> print(a)
[0, 1, 2, [10086, 1]]
>>> print(b)
[0, 1, 2, [10086, 1]]
>>> print(c)
[0, 1, 2, [0, 1]]
但是当 a 是一个复杂的列表时,例如这里时一个嵌套了列表的列表。当修改 a 中嵌套列表的值就会使浅复制的 b 中的值也发生改变。
结论
直接赋值 :只是将内存地址给了对象。
浅复制:只将父对象拷贝了一遍。
深复制:将父对象与子对象都拷贝了。
Python 之 copy() 与 deepcopy() 之间的区别的更多相关文章
- Python的copy()与deepcopy()区别
Python的copy()与deepcopy()分别对应浅拷贝和深拷贝. 它们的理论区别: deepcopy():深复制(也就是寻常意义上的复制),即将被复制对象完全再复制一遍作为独立的新个体单独存在 ...
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- iOS开发——基础篇——assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- 从python中copy与deepcopy的区别看python引用
讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...
- python中copy与deepcopy的区别
目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...
- python中copy()和deepcopy()详解
**首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...
- iOS中assign,copy,retain之间的区别以及weak和strong的区别(面试)
• copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象. • assign: 简单的直接赋值,相 ...
- Python的实例方法,类方法,静态方法之间的区别及调用关系
如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...
- Python的进阶:copy与deepcopy区别
copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式. 首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以 ...
随机推荐
- idea(or maven) 未结束字符串字面值 非法的表达式开始
[ERROR] *.java:[38,27] 未结束的字符串字面值 [ERROR] *.java:[38,53] 需要 ';' [ERROR] *.java:[41,19] 需要 ')' [ERROR ...
- HTTP接口抓包工具之Fiddler
Fiddler的基本功能介绍: Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了 ...
- Android 代码混淆规则
1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器 ...
- Nginx_安装
1. 安装步骤 上传nginx上传nginx安装包到linux 安装gcc 1 yum -y install gcc-c++ gcc 查看是否安装gcc: 1 gcc -v 安装依赖库 1 yum - ...
- 万达乐园VS阿里帝国 谁将是未来娱乐产业的龙头?
国内实体行业大佬王健林和互联网行业巨头马云,这次又不约而同地想到一块去了.从王健林叫板迪士尼大搞借势营销,到最近马云成立大文娱工作领导小组,明显的趋势表明娱乐越来越成为各界大佬们未来掘金的新战场.只不 ...
- Java程序监控---Metrics
概念 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控 目前最为流行的 metrics 库是来自 Coda ...
- Win10+WSL2+Ubuntu 18.04(WSL下)+VS Code(Win10下)+TexLive 2019(Ubuntu下)安装和配置
本人手头电脑是Win10 Home版全新安装的系统,由于不想在新系统盘里面安装TexLive导致固态硬盘不断扩大,所以,考虑安装Ubuntu做为WSL,然后把TexLive安装在Ubuntu,并通过V ...
- Python开发(三):字符编码,文件操作,函数
一:三级菜单 If len(choice) == continue # 判断输入的是否为空,为空就跳出这次循环进行下次循环, exit(“bye”) :退出程序显示,bye 二:编码 最早的编码是as ...
- 正式学习MVC 04
1.ActionResult ActionResult是一个父类, 子类包括了我们熟知的 ViewResult 返回相应的视图 ContentResult 返回字符串 RedirectResult( ...
- 前端的事件冒泡(例如点击一次onclick事件执行两次)解决办法
问题概要: 当我运用antd 中 radio组件的时候发现radio组件是有bug的 就是你不能给他赋予id 和 value,同时也绑定不上onclick等事件.举个例子: 可以看到 你就算赋予了id ...