基于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爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
python基础教程项目四之新闻聚合
Apr 02 Python
python交互界面的退出方法
Feb 16 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
Django集成celery发送异步邮件实例
Dec 17 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
python 爬取吉首大学网站成绩单
Jun 02 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
javascript 自定义事件初探
2009/08/21 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
echarts整合多个类似option的方法实例
2018/07/10 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
python简单实现操作Mysql数据库
2018/01/29 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
Django中create和save方法的不同
2019/08/13 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Python 使用office365邮箱的示例
2020/10/29 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
英国精品买手店:Browns Fashion
2016/09/29 全球购物
网上卖盒饭创业计划书
2014/01/26 职场文书
销售主管岗位职责
2014/02/08 职场文书
小学作文评语大全
2014/04/21 职场文书
股权转让协议范本
2014/12/07 职场文书
淘宝好评语句大全
2014/12/31 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
Python实现学生管理系统(面向对象版)
2021/06/24 Python
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技