基于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元组操作实例解析
Sep 23 Python
Python使用random和tertools模块解一些经典概率问题
Jan 28 Python
python实现rsa加密实例详解
Jul 19 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
python实现图片九宫格分割
Mar 07 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 Python
python区块链实现简版工作量证明
May 25 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 实用代码收集
2010/01/22 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php获取淘宝分类id示例
2014/01/16 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
js DOM的学习笔记
2011/12/22 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
javascript数组去重小结
2016/03/07 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
js实现日历与定时器
2017/02/22 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
Python3遍历目录树实现方法
2015/05/22 Python
详解Python验证码识别
2016/01/25 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
艺术爱好者的自我评价分享
2013/10/08 职场文书
临床医师个人自我评价
2014/04/06 职场文书
局火灾防控工作方案
2014/05/25 职场文书
公务员政审材料范文
2014/12/23 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python