三、深浅拷贝

  在Python中将一个变量的值传递给另外一个变量通常有三种:赋值、浅拷贝以及深拷贝

  讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字、字符串、布尔以及None等,还有一种像列表、元祖、字典等属于有基本数据类型作为最基本的元素组成的

在Python中基本数据类型的赋值、浅拷贝及深拷贝没有任何意义,都是指向同一块内存地址,也不存在层次的问题

>>> import copy
>>> n1 = 'abc'
>>> n2 = n1
>>> n3 = copy.copy(n1)
>>> n4 = copy.deepcopy(n1)
>>> id(n1)
140350336680040
>>> id(n2)
140350336680040
>>> id(n3)
140350336680040
>>> id(n4)
140350336680040

  说明:Python的copy模块的copy和deepcopy函数分别为我们实现了浅拷贝和深拷贝,我们可以看到,赋值、浅拷贝和深拷贝他们最后的id(Python内存地址的表达方式)都是一样的,没有分别

  现在讨论其他的字典,列表等这些非基本数据类型对象的赋值、浅拷贝及深拷贝的区别

  假设我们有这么一个字典n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}

  1、赋值

  我们知道赋值及时将变量的内存赋个另一个变量,让另一个变量指向那个内存地址

>>> n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}
>>> id(n1)
140350328984328
>>> n2 = n1
>>> id(n2)
140350328984328 # 可以看到内存地址和n1是完全一样的

  2、浅拷贝

  浅拷就是在内存中将第一层额外开辟空间进行存放

>>> n3 = copy.copy(n1)
>>> id(n3)
140350328986504 # 可以看n3的内存地址已经和n1不同了

  但是如果我们继续深入看一下n3里面的第二层的非基本数据类型的元素

>>> id(n1['k3'])
140350328603976
>>> id(n3['k3'])
140350328603976 # 字典里的列表还是指向同一个列表

  3、深拷贝

  深拷贝就是在内存中将数据从新创建一份,不仅仅是第一层,第二层、第三层...都会重新创建一份

>>> id(n1['k3'])
140350328603976
>>> id(n4['k3'])
140350328604296 # 可以看到第二层的列表也拷贝了一份,内存地址已经完全不一样

  注意:这仅局限于非基本数据类型,基本数据类型还会是同一个内存地址

>>> id(n1['k1'])
140350336680040
>>> id(n4['k1'])
140350336680040

我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)的更多相关文章

  1. 我的Python成长之路---第三天---Python基础(13)---2016年1月16日(雾霾)

    五.Python的常用的内置函数 Python为我们准备了大量的内置函数,如下图所示 这里我们只讨论红框内的内置函数 abs(x) 返回一个数的绝对值(模),参数可以是真说或浮点数 >>& ...

  2. 我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)

    四.函数 日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现.在编程的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代 ...

  3. 我的Python成长之路---第三天---Python基础(10)---2016年1月16日(雾霾)

    二.collections collections是对Python现有的数据类型的补充,在使用collections中的对象要先导入import collections模块 1.Counter——计数 ...

  4. 我的Python成长之路---第三天---Python基础(9)---2016年1月16日(雾霾)

    一.集合 set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合和我们数学中集合的概念是一样的,也有交集,并集,差集,对称差集等 ...

  5. 我的Python成长之路---第七天---Python基础(22)---2016年2月27日(晴)

    socket网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  6. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  7. python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...

  8. python成长之路——第三天

    一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在pyt ...

  9. 我的Python成长之路---第七天---Python基础(21)---2016年2月27日(晴)

    四.面向对象进阶 1.类方法 普通的方法通过对象调用,至少有一个self参数(调用的时候系统自动传递,不需要手工传递),而类方法由类直接调用,至少有一个cls参数,执行时,自动将调用该方法的类赋值个c ...

随机推荐

  1. Qt多线程编程总结(二)——QMutex

    QMutex类提供的是线程之间的访问顺序化. QMutex的目的是保护一个对象.数据结构或者代码段,所以同一时间只有一个线程可以访问它.(在Java术语中,它和同步关键字“synchronized”很 ...

  2. 基于Visual C++2013拆解世界五百强面试题--题1-定义各种类型指针

    用变量a给出下面的定义    a)一个整型数    b)一个指向整型数的指针    c)一个指向指针的指针,它指向的指针是指向一个整型数    d)一个有10个整型数的数组    e)一个有10个指针 ...

  3. PLSQL 导入表到Oracle------》从一个表空间导入到其它表空间

        在用PLSQL导入.dmp文件到Oracle时出现的问题如下: Import started on 2015/11/18 10:42:44E:\oracle\product\10.2.0\db ...

  4. Home | WebScraping.com

    Home | WebScraping.com We specialize in extracting data from websites, which is known as web scrapin ...

  5. 一个异或加密方案--C语言实现

    核心代码: char encrypt( char f , char c) { return f^c; } int OutEncrypt( char *FilePath, char *SecretWor ...

  6. POJ 2762 Going from u to v or from v to u? (Tarjan) - from lanshui_Yang

    Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has ...

  7. swiper,animate使用方法

    1.先链接css和js文件 <link rel="stylesheet" type="text/css" href="css/swiper-3. ...

  8. Eclipse新建Android工程,在模拟器运行的时候提示Unfortunately,XXX has stopped.

    刚新建好的android工程在模拟器运行的时候出错,提示Unfortunately,XXX has stopped 查看Eclipse下面的错误信息,双击第一条 把ActionBarActivity前 ...

  9. ppt类似工具AxeFile使用心得

    一个所谓的傻瓜式过渡效果自动生成工具.定义好展示窗口大小,加入时序.所谓的闪烁效果,也是相当的滑稽. 是一个非专业的简单的快速PPT工具. 但是体现的确是扁平化的设计思路,很值得深思. ------ ...

  10. poj 2096

    /** 程序员调bug思路: 一共有四种情况,1. 1个原有的bug 在原有的分类中2. 1个原有的bug 在新的分类中3. 1个新的bug 在原有的分类中4. 1个新bug 在新的分类中 **/ # ...