引用

Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的。

或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据。

看下面的例子:

 In [54]: a=4

 In [55]: b=a

 In [56]: id(a)
Out[56]: 1652425264 In [57]: id(b)
Out[57]: 1652425264

可以看到,a与b志向了同一个地址。这便是引用


浅拷贝与深拷贝

先来看一个例子:

In [58]: import copy

In [59]: a=[1,2,3]

In [60]: b=copy.copy(a)

In [61]: c=copy.deepcopy(a)

上面便是调用了标准模块copy,b浅拷贝了a,c深拷贝了a。

接下来,再看看3个变量的地址:

In [62]: id(a)
Out[62]: 2069478787912 In [63]: id(b)
Out[63]: 2069479182856 In [64]: id(c)
Out[64]: 2069479074568

可以看到,相对与引用,浅拷贝与深拷贝后,变量指向的地址都变了。那么,深拷贝与

浅拷贝之间到底有什么区别呢?咱们接下去分析结果:

In [65]: id(a[0])
Out[65]: 1652425168 In [66]: id(b[0])
Out[66]: 1652425168 In [67]: id(c[0])
Out[67]: 1652425168

这下明白了吧!对于一个列表里的元素,深拷贝和浅拷贝还是指向了原来的内存地址。

看到这里是不是会误以为它们两个没区别呢?好吧,再看看下面:

In [92]: a={'people':['brad','Alex'],'I':'xiaole'}

In [93]: b=copy.copy(a)

In [94]: c=copy.deepcopy(a)

In [95]: id(a['people'])
Out[95]: 2069478460104 In [96]: id(b['people'])
Out[96]: 2069478460104 In [97]: id(c['people'])
Out[97]: 2069479089608

可以看到,对于‘people’,浅拷贝还是指向了原来的内存地址。而深拷贝,

就是实实在在指向不同的地址,说白了就是把数据放在了不同的地方。

再说白了,浅拷贝就是在在内存中只额外创建第一层数据。

好吧,至此以为全都弄明白了,那请解释下下面的结果:

In [98]: id(a['I'])
Out[98]: 2069482265320 In [99]: id(b['I'])
Out[99]: 2069482265320 In [100]: id(c['I'])
Out[100]: 2069482265320

为何对于元素‘I’,又指向了同一个地址。说好的元素指向不同了呢?

想弄明白,看下面的重点提醒,并去琢磨下吧。

重点提醒!!!

对于数字和字符串,赋值、浅拷贝和深拷贝的值都指向同一个内存地址。

In [68]: a=3

In [69]: b=copy.copy(a)

In [70]: c=copy.deepcopy(a)

In [71]: id(a)
Out[71]: 1652425232 In [72]: id(b)
Out[72]: 1652425232 In [73]: id(c)
Out[73]: 1652425232

In [74]: a='brad'

In [75]: b=copy.copy(a)

In [76]: c=copy.deepcopy(a)

In [77]: id(a)
Out[77]: 2069482263528 In [78]: id(b)
Out[78]: 2069482263528 In [79]: id(c)
Out[79]: 2069482263528

说明:本人所用的解释器为Ipython

Python 引用、浅拷贝、深拷贝解析的更多相关文章

  1. Python__学习路上的坑之--引用,浅拷贝,深拷贝

    copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...

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

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

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

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

  4. Python中浅拷贝和深拷贝的区别总结与理解

    单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...

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

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

  6. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  7. python引用和对象详解

    python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...

  8. python中的深拷贝和潜拷贝

    >>> a = ['ace',['age',10]] >>> b = a[:] >>> c = list(a) >>> for ...

  9. python实现命令行解析的argparse的使用

    参考https://docs.python.org/3.6/library/argparse.html argparse模块使编写用户友好的命令行界面变得很容易.程序定义了它需要什么参数,argpar ...

随机推荐

  1. Brackets - 强大免费的开源跨平台Web前端开发工具IDE (HTML/CSS/Javascript代码编辑器)

    Brackets 是一个免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境 (IDE工具).该项目由 Adobe 创建和维护,根据MIT许可证发布,支持 Wind ...

  2. HDU-1995-汉诺塔V

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1995 这题不知道该说水还是不水,对于这题我看到题目数据,就有了想法,因为题目数据给的好 所以我直接 假 ...

  3. easelJS 初始入门

    easelJS 初始入门 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  4. Sql server2014 内存优化表 本地编译存储过程

    参考文献:http://www.infoq.com/cn/news/2013/09/Compiled-Queries http://www.bianceng.cn/database/SQLServer ...

  5. PHP用户注册邮箱并验证激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 查 ...

  6. Flex之HTML5视频播放解决方案

    Flex的video类对于视频播放在ios操作系统下表现出不兼容,采用调用ios源生播放器的思路,那么怎么调呢? 话说Html5 和Flex是竞争关系,这次利用Html5的video标签实现ios播放 ...

  7. POJ2115(扩展欧几里得)

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23700   Accepted: 6550 Descr ...

  8. ProjectManager Beta 2 项目管理器发布

    上次载Alpha阶段有一个可用版本Alpha 8也在这个博客发布了,传送:http://www.cnblogs.com/deali/p/ProjectManager.html ProjectManag ...

  9. 你不知道的getComputedStyle

    你不知道的getComputedStyle jQuery的css()的底层实现就用到了getComputedStyle这个方法,也许我们用到的很少,但是不得不说这时一个非常强大的函数,下面让我们一探究 ...

  10. ArcGIS API for JavaScript 4.2学习笔记[2] 显示3D地图

    3D地图又叫场景. 由上一篇可知, require入口函数的第一个参数是字符串数组 ["esri/Map", "esri/views/MapView", &qu ...