基于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 运算符 供重载参考
Jun 11 Python
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python标准库之collections包的使用教程
Apr 27 Python
机器学习10大经典算法详解
Dec 07 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
500行python代码实现飞机大战
Apr 24 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
Python面向对象之成员相关知识总结
Jun 24 Python
分析Python list操作为什么会错误
Nov 17 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP MSSQL 存储过程的方法
2008/12/24 PHP
php牛逼的面试题分享
2013/01/18 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
再谈JavaScript线程
2015/07/10 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
基于pip install django失败时的解决方法
2018/06/12 Python
Python语言进阶知识点总结
2019/05/28 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
室内设计自我鉴定
2013/10/15 职场文书
顶岗实习计划书
2014/01/10 职场文书
采购助理岗位职责
2014/02/16 职场文书
综合实践活动总结
2014/05/05 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
2014年政协工作总结
2014/12/09 职场文书
2015年营业员工作总结
2015/04/23 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
小学生暑假安全公约
2015/07/14 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js