基于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实现的各种排序算法代码
Mar 04 Python
Python实现模拟时钟代码推荐
Nov 08 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
python的help函数如何使用
Jun 11 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
用python修改excel表某一列内容的操作方法
Jun 11 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
dojo 之基础篇
2007/03/24 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
详解node中创建服务进程
2017/05/09 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
Python常用内置函数总结
2015/02/08 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
Python实现常见的回文字符串算法
2018/11/14 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
Python图像读写方法对比
2020/11/16 Python
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
卫生巾广告词
2014/03/18 职场文书
产品售后服务承诺书
2014/05/21 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python