基于Python List的赋值方法


Posted in Python onJune 23, 2018

Python中关于对象复制有三种类型的使用方式,赋值、浅拷贝与深拷贝。他们既有区别又有联系,刚好最近碰到这一类的问题,研究下。

一、赋值

在python中,对象的赋值就是简单的对象引用,这点和C++不同。如下:

a = [1,2,3,"hello",["python","C++"]] 
b = a 
print a==b #True

这种情况下,b和a是一样的,他们指向同一片内存,b不过是a的别名,是引用。我们可以使用a与b是否相同来判断,返回True,表明他们地址相同,内容相同。

赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了新对象的引用。也就是说,除了b这个名字以外,没有其它的内存开销。

修改了a,就影响了b;同理,修改了b就影响了a。

a = [1,2,3,"hello",["python","C++"]] 
b = a 
b.append("ADD") 
print "a=",a,"b=",b
#a=[1, 2, 3, 'hello', ['python', 'C++'], 'ADD'] b=[1, 2, 3, 'hello', ['python', 'C++'], 'ADD']

二、浅拷贝(shallow copy)

浅拷贝会创建新对象,其内容是原对象的引用。

浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数。

比如对上述a:

1、切片操作:b = a[:] 或者 b = [each for each in a]

2、工厂函数:b = list(a)

3、copy函数:b = copy.copy(a)

浅拷贝产生的b不再是a了,使用is可以发现他们不是同一个对象,使用id查看,发现它们也不指向同一片内存。但是当我们使用 id(x) for x in a 和 id(x) for x in b 时,可以看到二者包含的元素的地址是相同的。

在这种情况下,a和b是不同的对象,修改b理论上不会影响a。比如b.append([4,5])。

a = [1,2,3,"hello",["python","C++"]] 
b = a[:] 
b.append("ADD") 
print "a",a,"b",b 
#a [1, 2, 3, 'hello', ['python', 'C++']] b [1, 2, 3, 'hello', ['python', 'C++'], 'ADD']

但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在a中有一个嵌套的list,如果我们修改了它,情况就不一样了。

a[4].append("C")。查看b,你将发现b也发生了变化。这是因为,你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一个位置。

三、深拷贝(deep copy)

深拷贝只有一种形式,copy模块中的deepcopy函数。

和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。

同样对la,若使用b = copy.deepcopy(a),再修改b将不会影响到a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。

四、关于拷贝操作的警告

1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。

2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

以上这篇基于Python List的赋值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python Django模板的使用方法(图文)
Nov 04 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
Python OpenCV实现视频分帧
Jun 01 Python
python中metaclass原理与用法详解
Jun 25 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
利用matplotlib为图片上添加触发事件进行交互
Apr 23 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
Python调用C语言程序方法解析
Jul 07 Python
对Python 字典元素进行删除的方法
Jul 31 Python
python统计多维数组的行数和列数实例
Jun 23 #Python
Python返回数组/List长度的实例
Jun 23 #Python
python 定义给定初值或长度的list方法
Jun 23 #Python
Python列表解析配合if else的方法
Jun 23 #Python
基于Python列表解析(列表推导式)
Jun 23 #Python
python将回车作为输入内容的实例
Jun 23 #Python
Python 对输入的数字进行排序的方法
Jun 23 #Python
You might like
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
javascript版2048小游戏
2015/03/18 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
Move.js入门
2017/02/08 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
用Python解决计数原理问题的方法
2016/08/04 Python
python实时监控cpu小工具
2018/06/21 Python
Django models.py应用实现过程详解
2019/07/29 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
jupyter 导入csv文件方式
2020/04/21 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
电子信息科学专业自荐信
2014/01/30 职场文书
期终自我鉴定
2014/02/17 职场文书
五好关工委申报材料
2014/05/31 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年转正工作总结
2014/11/08 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android