要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念:

变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝)

【变量-对象-引用】

在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}......

甚至连type其本身都是对象,type对象

Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型

来确认变量到底是什么类型。

单独赋值: 比如说:

>>> a = 3

在运行a=3后,变量a变成了对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针

因为Python的变量不过是对象的引用,或指向对象的指针,因此在程序中可以经常改变变量引用

>>> x = 42      #变量绑定到整型对象

>>> x = 'Hello' #现在又成了字符串

>>> x = [1,2,3] #现在又成了列表

专业表述如下:

变量是一个系统表的元素,拥有指向对象的连接的空间

对象是被分配的一块内存,存储其所代表的值

引用是自动形成的从变量到对象的指针

特别注意: 类型属于对象,不是变量

比如像刚才的a=3, 整数对象3包含了两重信息

1.值为3

2.一个头部信息:告诉Pthyon,这是个整数对象[相当于一个指向int的指针]

共享引用: 比如说:

>>> a = 3

>>> b = a

在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.

从上图可以看到,a和b,其id完全一样,指向同一个整数对象3,或者说同一块内存

如果删掉a后, 不会影响b

拷贝概念的引入就是针对:可变对象的共享引用潜在的副作用而提出的.

【可变对象-不可变对象】

在Python中不可变对象指:一旦创建就不可修改的对象,包括字符串,元祖,数字

在Python中可变对象是指:可以修改的对象,包括:列表、字典

上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。

>>> L1 = [2,3,4]      #L1变量指向的是一个可变对象:列表

>>> L2 = L1           #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]

>>> L1[0] = 200       #因为列表可变,改变L1中第一个元素的值

>>> L1; L2            #改变后,L1,L2同时改变,因为对象本身值变了

[200, 3, 4]

[200, 3, 4]

如果不想改变列表L2的值,有两种方法:切片 和 copy模块

>>> L1 = [2,3,4]

>>> L2 = L1

>>> id(L1);id(L2)     #共享引用一个可变对象

45811784L

45811784L

>>> L2 = L1[:]        #切片操作

>>> id(L1);id(L2)     #切片后,对象就不一样了

45811784L

45806920L

>>> L1[0] = 200

>>> L1;L2             #L1发生改变,L2没有变化

[200, 3, 4]

[2,   3, 4]

【拷贝】

1. 切片技术应用于所有的序列,包括:列表、字符串、元祖

>>>但切片不能应用于字典。对字典只能使用D.copy()方法或D.deepcopy()方法.

2. 深浅拷贝,即可用于序列,也可用于字典

>>> import copy

>>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象

>>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

如果字典只有顶级对象:

如果字典中嵌套对象:

【结论】

深浅拷贝都是对源对象的复制,占用不同的内存空间

如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象

如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝

序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

python深复制与浅复制_Python中的深拷贝和浅拷贝详解相关推荐

  1. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  2. python脚本运行时网络异常_Python中异常重试的解决方案详解

    前言 大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理. 原先的流程: def crawl_page(url): pass def log_ ...

  3. python常用的装饰器库_Python中的各种装饰器详解

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  4. python object的实例是什么_python中的type和object详解

    这篇博客主要描述Python的新风格对象(new-style objects),如下: 和分别是什么? 用户自定义的类和实例之间是怎么联系的?它们和内置类型又是怎么联系的? 什么是元类(metacla ...

  5. python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解

    甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...

  6. python的sort方法是哪种_python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

  7. python find的使用方法_Python中的rfind()方法使用详解

    Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...

  8. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  9. python xlrd课程_python中xlrd模块的使用详解

    一.xlrd的安装 打开cmd输入pip install xlrd安装完成即可 二.xlrd模块的使用 下面以这个工作簿为例 1.导入模块 import xlrd 2.打开工作薄 # filename ...

最新文章

  1. python not函数_python 函数
  2. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)
  3. 解决HBase RegionServer进程还在,但是显示已经dead了
  4. 网易2022秋季校园招聘-通用技术A卷-0821
  5. javascript-排序算法
  6. 收藏网站制作常用经典css.div.布局.设计实例打包下载
  7. Office 2010导致 VS2008 页面设计器无响应
  8. 一文掌握 Docker 技术体系
  9. 中科院-杨力祥视频教程 08课程
  10. 数据治理之数据质量管理
  11. tongweb设置gzip
  12. 如何用计算机制作海报,用电脑怎么做海报_电脑用什么软件做海报
  13. BGI-College生信入门——5、Linux下的软件安装与Vim编辑器
  14. 《数据库系统》(六)存储管理
  15. fiddler使用教程(全)
  16. 【Oracle】plsql连接64位的Oracle
  17. Windows10 移动热点无法正常开启
  18. Python自动化需要培训吗
  19. FreeBSD的make
  20. java 微信 摇一摇红包_如何开发微信摇一摇红包,摇一摇红包有什么作用

热门文章

  1. elasticsearch,python包pyes进行的处理
  2. 【LeetCode】13. Roman to Integer
  3. LeetCode 90.子集 II 中等难度
  4. .h 与.hpp文件的区别
  5. 内蒙古自治区2021高考成绩查询时间,内蒙古2021年高考成绩什么时候出来?
  6. linux无显卡运行程序,Ubuntu中在应用程序菜单添加未显示的应用程序启动器
  7. c语言编程 三角波,周期矩形波、周期锯齿波、周期三角波,C语言程序.doc
  8. 036_jQuery Ajax全局回调函数
  9. java runtime environment 官网_Java Runtime Environment SE Development Kit
  10. ios找不到信任证书_ios信任苹果企业级应用