在 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() 之间的区别的更多相关文章

  1. Python的copy()与deepcopy()区别

    Python的copy()与deepcopy()分别对应浅拷贝和深拷贝. 它们的理论区别: deepcopy():深复制(也就是寻常意义上的复制),即将被复制对象完全再复制一遍作为独立的新个体单独存在 ...

  2. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  3. iOS开发——基础篇——assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  4. 从python中copy与deepcopy的区别看python引用

    讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...

  5. python中copy与deepcopy的区别

    目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...

  6. python中copy()和deepcopy()详解

    **首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...

  7. iOS中assign,copy,retain之间的区别以及weak和strong的区别(面试)

    • copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象. • assign:  简单的直接赋值,相 ...

  8. Python的实例方法,类方法,静态方法之间的区别及调用关系

    如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...

  9. Python的进阶:copy与deepcopy区别

    copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式. 首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以 ...

随机推荐

  1. C语言Windows程序设计—— 使用计时器

    传统意义上的计时器是指利用特定的原理来测量时间的装置, 在古代, 常用沙漏.点燃一炷香等方式进行粗略的计时, 在现代科技的带动下, 计时水平越来越高, 也越来越精确, 之所以需要进行计时是在很多情况下 ...

  2. JS数组去重算法

    思路: 1.创建一个新的数组存放结果 2.创建一个空对象 3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为 ...

  3. TCP\IP协议簇-分层模型

    OSI 模型   数据单元 层 功能 主机层 Data(数据) 7. 应用层 网络进程到应用程序. 6. 表示层 数据表示形式,加密和解密,把机器相关的数据转换成独立于机器的数据. 5. 会话层 主机 ...

  4. mybatis的通用mapper小结

    import tk.mybatis.mapper.entity.Example; //此包是tk下的1.定义一个dao层接口不需要任何方法 需要继承Mapper<类型> 2.在servic ...

  5. Java多态详解

    package QianFeng02; //多态 public class Polymorphic { public static void main(String[] args){ // HomeC ...

  6. vue基础指令了解

    Vue了解 """ vue框架 vue是前台框架:Angular.React.Vue vue:结合其他框架优点.轻量级.中文API.数据驱动.双向绑定.MVVM设计模式. ...

  7. 使用mysql创建自己的物化视图

    物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果.物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查 ...

  8. LitePal

      Litepal采用的是对象关系映射(ORM)模式   LitePal的配置工作. 1.添加依赖  compile 'org.litepal.android:core:1.3.2' 2.配置lite ...

  9. Python——4Dict和Set类型

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  10. python 写入 execl 文件 之 xlwt 模块

    1. xlwt 安装 pip install xlwt 2. xlwt 操作, 代码 #!/usr/bin/env python3 import xlwt # 只能创建 新的 excel 文件 # 1 ...