在 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. ajax 接受后台中文数据出现"?"(疑问号)解决方案

    把后端要返回的数据转成一个JSONObject类型返回,返回String 类型数据使用JSONObject来封装然后返回,绝对不会出现???了, 要是返回的是一个实体类的话,需要在前端或者后端做转换成 ...

  2. Java找出两个链表的第一个公共节点

    题目描述输入两个链表,找出它们的第一个公共结点. 我的思路:因为是链表,长度都是未知的,不能盲目的两个一起开始自增判断. 首先需要得到 L1的长度 和 L2的长度,让较长的那个先走 (length1- ...

  3. Ionic3学习笔记(十三)HttpClient 实现 HTTP 请求以及踩过的一些坑

    本文为原创文章,转载请标明出处 目录 猫眼API HttpClient 实现 HTTP 请求 安装 HttpClientModule 模块 创建 provider 创建 page 一些坑 坑1: 未在 ...

  4. 对Design model的理解与Java design model的归纳

    设计模式的起源是面向对象程序设计思想,是面向对象设计的精髓--抽象.面向对象通过类和对象来实现抽象,实现时产生了面向对象的三个重要机制:封装.继承.多态.正是这三个机制衍生出了各种各样的设计模式.在面 ...

  5. python 有关堡垒机的那些事

    堡垒机为了保证系统或服务器的安全性,防止运维和开发人员胡乱操作服务器,导致不必要的损失,使用堡垒机来完成对运维和开发人员的授权.用户统一登录堡垒机账号来操作系统或服务器.堡垒机等于成了生产系统的SSO ...

  6. python标准库-builtin 模块之compile,execfile

    eval函数仅仅允许执行简单的表达式.对于更大的代码块时,使用compile和exec函数. 例子:使用 compile函数验证语法 NAME = "script.py" BODY ...

  7. Leetcode 703题数据流中的第K大元素(Kth Largest Element in a Stream)Java语言求解

    题目链接 https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/ 题目内容 设计一个找到数据流中第K大元素的类(class) ...

  8. PHP数组知识点整理

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

  9. C++走向远洋——43(人数不定的工资类,动态分配内存与释放)

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

  10. Sublime Text3 旧版本下载以及破解激活方式

    前言 当前Sublime Text3 出到了32**版本,以前直接输入激活码的方法已经不能使用. 而官网又不提供旧版本的下载链接,因此在此分享旧版本下载方式以及激活方式. 下载方法 通过下面这个链接下 ...