基于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中使用copy模块实现列表(list)拷贝
Apr 14 Python
在Python的web框架中配置app的教程
Apr 30 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
基于matplotlib xticks用法详解
Apr 16 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Selenium python时间控件输入问题解决方案
Jul 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
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
python 实现两个npy档案合并
2020/07/01 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
酒吧员工的岗位职责
2013/11/26 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
中国央视网签名寄语
2014/01/18 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
抽样调查项目计划书
2014/04/24 职场文书
反邪教警示教育方案
2014/05/13 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
个人工作保证书
2015/02/28 职场文书