基于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 paramiko实现ssh远程访问的方法
Dec 03 Python
python简单猜数游戏实例
Jul 09 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
python执行使用shell命令方法分享
Nov 08 Python
详解python字节码
Feb 07 Python
Django开发中复选框用法示例
Mar 20 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 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中删除变量时unset()和null的区别分析
2011/01/27 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
php socket通信简单实现
2016/11/18 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
详解vue v-model
2020/08/31 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
英语国培研修感言
2014/02/13 职场文书
政府个人对照检查材料
2014/08/28 职场文书
高三语文教学反思
2016/02/16 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫