基于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读写文件操作示例程序
Dec 02 Python
python实现给字典添加条目的方法
Sep 25 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Flask之flask-session的具体使用
Jul 26 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
python实现简单颜色识别程序
Feb 19 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
python 连续不等式语法糖实例
Apr 15 Python
详解python tcp编程
Aug 24 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
smarty表格换行实例
2014/12/15 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python中的rfind()方法使用详解
2015/05/19 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
keras slice layer 层实现方式
2020/06/11 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
自我评价的写作规则
2014/01/06 职场文书
高二地理教学反思
2014/01/24 职场文书
python实现进度条的多种实现
2021/04/29 Python