Python 引用、浅拷贝、深拷贝解析
引用
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 引用、浅拷贝、深拷贝解析的更多相关文章
- Python__学习路上的坑之--引用,浅拷贝,深拷贝
copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...
- 深度解析:python之浅拷贝与深拷贝
深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...
- **Python中的深拷贝和浅拷贝详解
Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要 ...
- Python中浅拷贝和深拷贝的区别总结与理解
单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...
- Python对象拷贝——深拷贝与浅拷贝
对象赋值 浅拷贝 深拷贝 1. 对象赋值 对象的赋值实际上是对对象的引用.也就是说当把一个对象赋值给另一个对象时,只是拷贝了引用.如: >>> t1 = tuple('furzoom ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- python引用和对象详解
python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...
- python中的深拷贝和潜拷贝
>>> a = ['ace',['age',10]] >>> b = a[:] >>> c = list(a) >>> for ...
- python实现命令行解析的argparse的使用
参考https://docs.python.org/3.6/library/argparse.html argparse模块使编写用户友好的命令行界面变得很容易.程序定义了它需要什么参数,argpar ...
随机推荐
- 使用布局(Layout资源)
实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...
- windows下修改apache并发数
还没有尝试 修改apache的最大连接数,方法如下: 步骤一 先修改 /path/apache/conf/httpd.conf文件. # vi httpd.conf 将“#Include conf/e ...
- 使用ActionBar实现下拉式导航
ActionBar除可提供Tab导航支持之外,还提供了下拉式(DropDown)导航方式.下拉式导航的ActionBar在顶端生成下拉列表框,当用户单击某个列表项时,系统根据用户单击事件导航指定Fra ...
- Java多线程(学习篇)
Java多线程:(学习篇) 1.什么是线程 2.线程状态 3.线程中断 4.线程交互 5.同步机制 6.锁机制 7.堵塞队列与堵塞栈 8.条件变量.原子量.线程池等 9.线性安全类和Callable与 ...
- MyBatis Generator 的使用
1,以插件的形式加入到eclipse/dropins中: 2,设置mybatis-generator.xml文件: <?xml version="1.0" encoding= ...
- 通过浏览器navigator判断浏览器版本或者手机类型&&判断微信访问
javascript 的navigator属性,不常用,但是用处也不少,主要用处是在做浏览器兼容的问题的时候,现在有的网站已经不兼容IE6,用户假如用IE6浏览网页的话,会提示浏览器升级等信息.或者判 ...
- python中关于局部变量与全局变量的认识
1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,函数中使用的将是局部变量,例如: num = 100 def func(): num = ...
- asp.net权限认证篇外:集成域账号登录
在之前的我们已经讲过asp.net权限认证:Windows认证,现在我们来讲讲域账号登录, 这不是同一件事哦,windows认证更多的是对资源访问的一种权限管控,而域账号登录更多的是针对用户登录的认证 ...
- CSS的兼容性与BUG处理
骨灰级清除浮动 .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility ...
- 怎样在chrome中内置扩展,以及一些简单的定制
本文中chromium 版本为54 参考资料: chromium如何新增extension API以及添加内部扩展 http://slides.com/luyuan/grit#/ 一.嵌入扩展 1. ...