在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题。所以,在这里按个人的理解谈谈它们之间的区别。

一、赋值(assignment)

在《Python FAQ1》一文中,对赋值已经讲的很清楚了,关键要理解变量与对象的关系。

>>> a = [1, 2, 3]

>>> b = a

>>> print(id(a), id(b), sep='\n')

139701469405552

139701469405552

在Python中,用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已。

如上例,通过使用内置函数 id() ,可以看出 a 和 b 指向内存中同一个对象。a is b会返回 True 。

二、浅拷贝(shallow copy)

注意:浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。

所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用。(拷贝组合对象,不拷贝子对象)

常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。

>>> a = [1, 2, 3]

>>> b = list(a)

>>> print(id(a), id(b)) # a和b身份不同

140601785066200 140601784764968

>>> for x, y in zip(a, b): # 但它们包含的子对象身份相同

... print(id(x), id(y))

...

140601911441984 140601911441984

140601911442016 140601911442016

140601911442048 140601911442048

从上面可以明显的看出来,a 浅拷贝得到 b,a 和 b 指向内存中不同的 list 对象,但它们的元素却指向相同的 int 对象。这就是浅拷贝!

三、深拷贝(deep copy)

所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。

深拷贝只有一种方式:copy模块中的deepcopy函数。

>>> import copy

>>> a = [1, 2, 3]

>>> b = copy.deepcopy(a)

>>> print(id(a), id(b))

140601785065840 140601785066200

>>> for x, y in zip(a, b):

... print(id(x), id(y))

...

140601911441984 140601911441984

140601911442016 140601911442016

140601911442048 140601911442048

看了上面的例子,有人可能会疑惑:

为什么使用了深拷贝,a和b中元素的id还是一样呢?

答:这是因为对于不可变对象,当需要一个新的对象时,python可能会返回已经存在的某个类型和值都一致的对象的引用。而且这种机制并不会影响 a 和 b 的相互独立性,因为当两个元素指向同一个不可变对象时,对其中一个赋值不会影响另外一个。

我们可以用一个包含可变对象的列表来确切地展示“浅拷贝”与“深拷贝”的区别:

>>> import copy

>>> a = [[1, 2],[5, 6], [8, 9]]

>>> b = copy.copy(a) # 浅拷贝得到b

>>> c = copy.deepcopy(a) # 深拷贝得到c

>>> print(id(a), id(b)) # a 和 b 不同

139832578518984 139832578335520

>>> for x, y in zip(a, b): # a 和 b 的子对象相同

... print(id(x), id(y))

...

139832578622816 139832578622816

139832578622672 139832578622672

139832578623104 139832578623104

>>> print(id(a), id(c)) # a 和 c 不同

139832578518984 139832578622456

>>> for x, y in zip(a, c): # a 和 c 的子对象也不同

... print(id(x), id(y))

...

139832578622816 139832578621520

139832578622672 139832578518912

139832578623104 139832578623392

从这个例子中可以清晰地看出浅拷贝与深拷贝地区别。

总结:

1、赋值:简单地拷贝对象的引用,两个对象的id相同。

2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。

3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。

浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。

python中赋值-浅拷贝-深拷贝之间的关系

赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...

python 中的 赋值 浅拷贝 深拷贝

1.对象的赋值 都是进行对象引用(内存地址)传递,即 b is a ,a 变 b也变 2.浅拷贝 会创建一个新的对象,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址) 当我们使用下面的操作 ...

搞不懂JS中赋值·浅拷贝·深拷贝的请看这里

前言 百科定义:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这 ...

Python对象拷贝——深拷贝与浅拷贝

对象赋值 浅拷贝 深拷贝 1. 对象赋值 对象的赋值实际上是对对象的引用.也就是说当把一个对象赋值给另一个对象时,只是拷贝了引用.如: >>> t1 = tuple('furzoom ...

Python中的赋值、深拷贝与浅拷贝(内存地址)

Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...

对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...

python中的深拷贝和浅拷贝

python的复制,深拷贝和浅拷贝的区别   在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一 ...

Python的浅拷贝与深拷贝

定义: =号浅拷贝:在Python中对象的赋值其实就是对象的引用.copy了之后两个仍然是同一个东西.那么他们内部的元素自然也是一样的,对其中一个进行修改,另一个也会跟着变> copy()浅拷贝 ...

深度解析:python之浅拷贝与深拷贝

深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

随机推荐

HTML自定义对象与属性(谷歌,火狐,IE9浏览器没问题)

1.自定义标签 asdas 页面变色 2.自定义标签的hov ...

css+js定位到屏幕中间

ex:让一个div始终显示在屏幕中间 一. css:#idName{position: absolute;z-index: 999;width: ?px;margin-top: ?px;}//此处的初 ...

数据库(表)的逻辑备份与恢复<四>

数据库(表)的逻辑备份与恢复  介绍 逻辑备份是指使用工具 export 将数据对象的结构和数据导出到文件的过程,逻辑恢复是指当数据库对象被误操作而损坏后使用 工具 import 利用备份的文件把数 ...

[php/html/CSS]给Aptana3 安装 Emmet插件

aptana studio3 安装 zencoding(Emmet) 插件 zen coding 更名为Emmet emmet 谷歌主页地址:http://code.google.com/p/zen- ...

python 第三方模块 转 https://github.com/masterpy/zwpy_lst

Chardet,字符编码探测器,可以自动检测文本.网页.xml的编码. colorama,主要用来给文本添加各种颜色,并且非常简单易用. Prettytable,主要用于在终端或浏览器端构建格式化的输 ...

debian 64位系统中添加对32位的支持

dpkg --add-architecture i386 apt-get update apt-get install ia32-libs

2807:两倍-poj

2807:两倍 总时间限制:  1000ms 内存限制:  65536kB 描述 给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍. 比如给定1 4 ...

SQL server 建立标后,执行代码添加外键

alter table dbo.student add constraint FK_tstudent_class foreign key(classno) references dbo.class(c ...

Spring中Bean的生命周期及其扩展点

原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6106456.html Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spr ...

第三部分:Android 应用程序接口指南---第二节:UI---第五章 设置(Settings)

第5章 设置(Settings) 应用程序通常包括允许用户修改应用程序的特性和行为的设置功能.例如,一些应用程序允许用户指定通知是否启用或指定多久使用云同步数据.如果你想要为你的应用程序提供设置,你应 ...

python赋值浅拷贝和深拷贝的区别_python赋值、浅拷贝、深拷贝区别相关推荐

  1. r语言和python-Python和R语言的区别_Python与R的区别和联系

    Python和R语言的区别_Python与R的区别和联系 可能问这个问题会很无脑,但是我还没有深入接触过Python,只是用过R语言.谁能帮我解答一下,这两者的主要区别呢?是否存在代替关系呢? 精彩解 ...

  2. python中浅拷贝和深拷贝的区别_Python中浅拷贝和深拷贝的区别

    Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  3. python语言与其他语言的区别_python与其他编程语言区别全在这

    对于接触过编程语言的人来说,如果要快速上手python,首先要了解python和其他编程语言的主要区别在哪?下边勇哥主要以使用较多的JAVA和C语言来做对比.喜欢的话,希望大家关注我们,我们会持续推出 ...

  4. python install pip 区别_python conda、pip区别,python 下 faiss 安装

    在安装一些python的安装包时,我们会使用conda install ~或者pip install ~ 网上说conda是安装到云端,而pip是安装到本地,那二者究竟有什么区别,可以参考下这个点击打 ...

  5. python格式化输出区别_python格式化输出的区别

    python对于数的输出包括%d和%f,下面来详细介绍python对数的输出. (1)输出整型 a=55 print("%d"%a) #直接输出整数a print("%4 ...

  6. matlab与python区别_python和matlab的区别

    详细内容 Python是一种面向对象的解释型计算机程序设计语言.Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议 . ...

  7. python中全局变量和局部变量的区别_Python全局变量与局部变量区别及用法分析

    本文实例讲述了Python全局变量与局部变量区别及用法.分享给大家供大家参考,具体如下: 对于很多初学的同学,对全局和局部变量容易混淆,看看下面给大家的讲解相信都应该明白两者的区别了. 定义: 全局变 ...

  8. python和c语言和java有什么区别_python和c的区别 python、java和c语言的区别?

    Python和c语言有什么区别如果我的坚强任性,会不小心伤害了你.你能不能温柔提醒,我虽然心太急,更害怕错过你 前者为 脚本语言 需要虚拟机 解释执行 ..一般情况下 不能生成exe(要使用打包工具) ...

  9. python列表字典的区别_python列表和字典区别

    列表 1.任意对象的有序集合 列表是一组任意类型的值,按照一定顺序组合而成的 2.通过偏移读取 组成列表的值叫做元素(Elements).每一个元素被标识一个索引,第一个索引是0,序列的功能都能实现 ...

最新文章

  1. LeetCode简单题之生成每种字符都是奇数个的字符串
  2. ubuntu mysql登陆_ubuntu mysql 配置 远程登陆
  3. 浏览器访问solr报错:HTTP Status 500 - {msg=SolrCore 'collection1' is not available due to init failure
  4. (附)python3 只需3小时带你轻松入门——python常用一般性术语或词语的简单解释
  5. PowerVim - 强大的vim配置
  6. 机器人操作系统--ROS系统安装配置详细教程及实践
  7. 小米10青春版刷鸿蒙,没有高刷弱不禁风?小米10青春版刷新低价,这次用户或许会满意!...
  8. 教程 Re:Zero ROS (五)—— 导入模型,关节控制器
  9. 《自然》:深度学习超分辨显微成像方法
  10. 如何选择一个合适的物联网模块
  11. Endnote X7 基本功能及实用笔记
  12. 那些年找工作入过的坑! 避雷!!!!
  13. gcrobustvar:基于VAR的稳健性Granger因果检验
  14. .NetCore——Autofac使用
  15. macOS配置java环境
  16. UESTC -- 1061 秋实大哥与战争(暴力/set)
  17. linux qq rpm最新版,腾讯重新发布QQ Linux版,完美适配新支点国产操作系统
  18. bzoj2251 外星联络
  19. VBScript脚本自动发信息
  20. 负载均衡-Feign(二)

热门文章

  1. C语言程序care用法,care的用法
  2. 如何恢复移动硬盘数据呢?
  3. LeetCode刷题笔记- 15.三数之和
  4. redis练习手册redis的配置文件redis.conf介绍
  5. 达人评测 i5 1135G7、 i5 1155G7和i7 1165g7选哪个好
  6. Qt creator h:127: error: ‘void QAbstractButton::clicked(bool)‘ is protected
  7. 你知道大数据中的五种采集方式吗?
  8. html闪消息,flask - 消息闪烁( Message Flashing)
  9. 高中生活-第6篇–批评和表扬之间的对决
  10. w10 保护你的计算机,怎么锁定计算机?增强W10装机版锁定电脑屏幕的步骤