基于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 Web开发框架Django
Jun 30 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
python设置环境变量的作用和实例
Jul 09 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
如何通过python检查文件是否被占用
Dec 18 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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
德劲1107的电路分析与打磨
2021/03/02 无线电
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
php的hash算法介绍
2014/02/13 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
python 从远程服务器下载东西的代码
2013/02/10 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python遍历路径破解表单的示例
2020/11/21 Python
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
.NET方向面试题
2014/11/20 面试题
教师绩效工资方案
2014/02/01 职场文书
简单的项目建议书模板
2014/03/12 职场文书
小学生寒假家长评语
2014/04/16 职场文书
市场营销专业求职信
2014/06/17 职场文书
工作失职检讨书范文
2015/05/05 职场文书
教师聘用意向书
2015/05/11 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
资产移交协议书
2016/03/24 职场文书