基于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中函数传递参数是值传递还是引用传递
Nov 07 Python
Python enumerate索引迭代代码解析
Jan 19 Python
在Python中使用gRPC的方法示例
Aug 08 Python
tensorflow实现加载mnist数据集
Sep 08 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Django中Middleware中的函数详解
Jul 18 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 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实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php时间计算相关问题小结
2016/05/09 PHP
微信自定义分享php代码分析
2016/11/24 PHP
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
js实现全选和全不选
2020/07/28 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
python判断设备是否联网的方法
2018/06/29 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
python单例模式实例解析
2018/08/28 Python
python调用staf自动化框架的方法
2018/12/26 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
python破解同事的压缩包密码
2020/10/14 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
销售总监岗位职责
2014/01/04 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
学习十八大演讲稿
2014/09/15 职场文书
单位委托书怎么写
2014/09/21 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
百年孤独读书笔记
2015/06/29 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
python中filter,map,reduce的作用
2022/06/10 Python