基于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之大话题小函数(1)
Oct 10 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
python中pass语句用法实例分析
Apr 30 Python
Python获取邮件地址的方法
Jul 10 Python
python实现的多线程端口扫描功能示例
Jan 21 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python中的引用和拷贝实例解析
Nov 14 Python
Python多线程获取返回值代码实例
Feb 17 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
Pytest之测试命名规则的使用
Apr 16 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新手用的Insert和Update语句构造类
2012/03/31 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
python连接池实现示例程序
2013/11/26 Python
Python3基础之函数用法
2014/08/13 Python
python在指定目录下查找gif文件的方法
2015/05/04 Python
利用python实现数据分析
2017/01/11 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
成功的酒店创业计划书
2013/12/27 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
酒店营销策划方案
2014/02/07 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python