深拷贝定义(deepcopy)

在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量。但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都是浅拷贝,如果需要使用深拷贝,需要特别指定。

深拷贝是对原对象的“复制以及粘贴”,其实就是在内存中重新开辟了一个新的内存空间来存放这一份数据,两个变量其实是两个不一样的变量,仅仅是数据值相同而已,对两个变量的操作不会相互影响。

浅拷贝(copy)

在Python中进行数据的浅拷贝时,如果此时浅拷贝的数据是Python中的原子数据结构,比如str,int,float,tuple等不可变的原子数据结构,那么在Python解释器中,会给新赋值的变量开辟一个新的内存空间,且新的内存空间中存放的值和浅拷贝的数据值一致。

例如:

此时需要注意,Python中如果int数值小于一定的数的话,Python还是会引用同一个数据值,也就是a和b两个变量的地址一样。如:

且当改变a和b的数值时,地址也会发生改变,就相当于是a和b都是两个指针,指向具体的存放数值的地址空间,如果修改完后a和b的数值一致,那么a和b的地址也会一样。如:

当对一些可变对象进行浅拷贝时,此时其实是对可变对象的二次引用,并没有重新开辟新的内存空间。如:

从图中可以看到,a和b都是对列表的引用,虽然a是先引用的该列表,但是他们在内存中的地址都是一样的,也就是说他们其实是同一个列表的两个不同的昵称而已。

列表的两种不同的赋值方式,“=”和切片操作,它们之间的区别如下:

“=”:该符号对于浅拷贝而言,其实就是将“=”两边的两个不同的变量同时指向了同一个内存空间,且内存空间的值是相同的。当一个变量对内存空间中的数值进行了修改之后,在使用另一个变量去引用该内存空间中的变量时,数值也会改变,因为他们都指向同一个数据值。

切片操作:当时切片操作(a[start_index:end_index])对一个列表进行赋值给另外一个变量时,这时不再是两个不同的变量同时指向一个内存地址空间中数据值,因为切片操作会返回一个新的列表,所以新的变量会接收一个新的列表,新的列表中的数据值就是切片之后的数据值,且在内存中的地址空间不一样。如图:

此时对c的任何操作与a(b)无关,因为a和b其实是同一个列表。

 但是当列表中有可变数据结构时(list,dict等)就会出现不一样的结果,因为在Python中,对于可变的数据类型,Python解释器会给变量采用引用的方式对 可变的数据类型的数据 进行引用,为了节省内存空间。 如图所示:

如果需要让两个变量能同时且独立的操作该列表(列表中有可变的数据类型的数据),那么就需要使用到深拷贝对数据进行直接到拷贝,而不是引用。此时需要使用到一个Python中的内书库函数copy,copy库中的deepcopy()方法可以对数据进行直接到拷贝(深拷贝),如图所示:

从图中可以看到,c是对a的深拷贝,b是对a的切片操作的浅拷贝,同时修改列表中的可变元素,可见c中的数据是存放在一个独立的内存空间中的。

在Python对数据对象进行拷贝时,需要注意:

第一、非容器类型(比如数字、字符串和其它“原子”类型的对象,像代码、类型和range对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成。
第二、如果元组变量中只包含原子类型对象,对它的深拷贝将不会进行。
从图中可以看到,tuple中都是“原子”类型的数据对象,此时对其进行深拷贝,但是查看内存中的地址,并没有给b重新开辟一个新的内存空间,所以需要注意这一点。
但是如果tuple有可变的数据类型的对象时,深拷贝是起作用的。
----------------------------------------------------------------------------------
如果您觉得我的博客对您有一定的帮助,可以给我一点点的鼓励,您的鼓励是对我的最大的肯定,我会继续努力。谢谢您。
 支付宝:                                      微信支付:
      
 

Python中复制、深拷贝和浅拷贝的区别的更多相关文章

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

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

  2. python中的深拷贝和浅拷贝

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

  3. 001 说说Python中的深拷贝和浅拷贝

    在Python编程中忽略深拷贝和浅拷贝可能会造成未知的风险. 比如我们打算保存一份原始对象的副本作为上一状态的记录,此后修改原始对象数据时,若是副本对象的数据也发生改变,那么这就是一个严重的错误. 注 ...

  4. Python赋值语句与深拷贝、浅拷贝的区别

    参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...

  5. python中的深拷贝与浅拷贝

    深拷贝和浅拷贝 浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变. 1.对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷 ...

  6. python中的深拷贝和浅拷贝理解

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: 利用切 ...

  7. python学习笔记--深拷贝与浅拷贝的区别

    首先我们来讲讲我们python中的可变对象和不可变对象: 可变对象:该对象指向内存中的值是可以改变的.实际上是其所指的值直接发生改变,而不是发生复制,或者开辟一个新的地址空间.例如:列表list,字典 ...

  8. Python 中的深拷贝和浅拷贝

    一.浅拷贝python中 对象赋值时 默认是浅拷贝,满足如下规律:1. 对于 不可变对象(字符串,元组 等),赋值 实际上是创建一个新的对象:例如: >>> person=['nam ...

  9. python赋值,深拷贝和浅拷贝的区别

    1.赋值 list1=[[1,2],'fei',66] list2=list1 list1 [[1, 2], 'fei', 66] list2 [[1, 2], 'fei', 66] list2.ap ...

  10. python中的深拷贝和浅拷贝(面试题二)

    一.浅拷贝 定义:浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值. 浅拷贝的特点: 公用一个值: 这两个变量的内存地址一样: 对其中一个变量的值改变,另外一个变量的值也 ...

随机推荐

  1. 存储过程返回update结果集和insert主键

    update teacher set name ='111' where id in(286,289);print @@rowcount;--或select将查出,是@@rowcount,不是@row ...

  2. spring mvc 多库连接

    最近弄了个spring mvc + hibernate4为框架的项目,其中需用到其他两个库的数据.具体如下: 1.将两库的application文件配置好,需注意的地方是两个事务控制是不一样的. 和 ...

  3. python 3 print function

    if episode % 50 == 0: print('Episode {} Total Reward: {} counter: {}'.format(episode,G,counter))

  4. Mac 安装GCC

    OS X上安装Homebrew和GCC的图文攻略 2016年08月31日 11:21:27 白马负金羁 阅读数:11380 标签: OS XGCCHomebrew 更多 个人分类: 应用技巧   版权 ...

  5. CentOS 最新版的下载地址 + 版本选择详解

    CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...

  6. docker-compose up启动又停止,需要加tty为true

    如果docker-compose.yml如下,则用docker-compose up -d启动起来的容器可能会立即停止. version: '2' services: mir-http-repo: i ...

  7. IntelliJ IDEA 2017版 导入maven项目需要的包

    1.选中项目,鼠标右键--->maven---->Reimport

  8. Redis数据结构(六)

    Redis数据结构(Sort-set)(游戏排名和微博热点话题排名上应用): 特点:可存储有序但不重复的数据,根据分数指定存储顺序 1 Sort-set和Set的区别: (1)sort的每个成员都是以 ...

  9. VS2010中如何将动态链接库改成静态链接库

    VS2010中如何将动态链接库改成静态链接库 VS2010静态编译生成的.exe可执行文件,可以免安装免DLL在其他电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态 ...

  10. centos7 mysql 数据库备份与还原

    数据库备份 show databases; #先查看一下数据库 现在我要备份word数据库 退出mysql输入 mysqldump -u root -p word > word.sql #我把它 ...