基于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动态加载变量示例分享
Feb 17 Python
用Python编写web API的教程
Apr 30 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
Python中模块与包有相同名字的处理方法
May 05 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
python中的decimal类型转换实例详解
Jun 26 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
Pygame框架实现飞机大战
Aug 07 Python
Python3读写ini配置文件的示例
Nov 06 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
Python获取字典中某个key的value
Apr 13 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另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php下获取http状态的实现代码
2014/05/09 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
python单链表实现代码实例
2013/11/21 Python
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python决策树之CART分类回归树详解
2017/12/20 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
《小猪家的桃花树》教学反思
2014/04/11 职场文书
关于保护环境的标语
2014/06/09 职场文书
学校捐款活动总结
2015/05/09 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
golang 接口嵌套实现复用的操作
2021/04/29 Golang
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
Java异常处理try catch的基本用法
2021/12/06 Java/Android