Python运算符+与+=的方法实例


Posted in Python onFebruary 18, 2021

Python 中如果需要对一个变量进行增量运算通常有两种写法,a = a + b 或 a += b。虽然两种方法能够得到同样的结果,但两者却并不完全等价。

加法运算符 +

对于 a = a + b 这条语句来说,实际上执行了两步操作,首先执行 a + b 求出两者的 和,然后再将结果通过赋值运算符 = 赋值给变量 a。

来看下面的示例:

>>> a = 100
>>> b = 200
>>> id(a)
1796532544
>>> a = a + b
>>> a
300
>>> id(a)
17756816
>>> a = [11, 22, 33]
>>> b = [44, 55, 66]
>>> id(a)
54675856
>>> a = a + b
>>> a
[11, 22, 33, 44, 55, 66]
>>> id(a)
54676416

以上分别使用 Python 中的 不可变类型 和 可变类型 各列举了一个示例,并且在执行 a = a + b 语句的前后分别打印了变量 a 的 id,可以看到无论对于 不可变类型 还是 可变类型,最终变量 a 的 id 值都会改变,说明变量 a 在执行 a = a + b 以后指向了一片新的内存地址。这也比较好理解,因为 a 已经被重新赋值了。

增量赋值运算符 +=

对于运算符 +=,我们通常管它叫作 增量赋值运算符,因为它即完成了 相加 操作,又完成了 赋值 操作。
同样,我们还是分别用 int 和 list 两种数据类型来做演示:

>>> a = 100
>>> b = 200
>>> id(a)
1796532544
>>> a += b
>>> a
300
>>> id(a)
17756784
>>> a = [11, 22, 33]
>>> b = [44, 55, 66]
>>> id(a)
48777616
>>> a += b
>>> a
[11, 22, 33, 44, 55, 66]
>>> id(a)
48777616

对于 不可变类型 的操作,a += b 表现出来的结果和 a = a + b 相同。而对于 可变类型 的操作却并不完全一样。虽然最终变量 a 的 值 相同,但执行 += 操作后,变量 a 的内存地址并没有改变,也就是说 += 操作对于 可变类型 来说实际上是 就地更改。对于 list 的操作,实际上 a += b 等价于 a.extend(b)。

__add__ 和 __iadd__ 方法

实际上,在 Python 中,加法运算符 + 对应着对象的 __add__ 方法,增量赋值运算符 += 对应着对象的 __iadd__ 方法。
无论对于 不可变类型 还是 可变类型,当执行 a = a + b 时,都会调用 a 的 __add__ 方法。而对于 a += b 的操作来说,当 a 为 不可变类型 时同样会调用 a 的 __add__ 方法,当 a 为 可变类型 时会调用 a 的 __iadd__ 方法进行 就地更改,如果 a 没有实现 __iadd__ 方法,那么才调用 a 的 __add__ 方法。

我们可以用 Python 内置的 hasattr 函数来验证上面的说法。

>>> hasattr(int, '__add__')
True
>>> hasattr(int, '__iadd__')
False
>>> hasattr(list, '__add__')
True
>>> hasattr(list, '__iadd__')
True

对于 不可变类型 来说,因为对象本身不可变,如果做相加操作必然会创建新的对象,所以也就没有 __iadd__ 方法。而对于 可变类型 来说,对象本身可变,所以实现了 __iadd__ 方法。

在我们自己定义的类型中如果需要实现以上两个方法,也要遵循 Python 现有的规范,一定要注意自己实现的类型是否可变,根据类型再来确定是否需要实现 __iadd__ 方法。

总结

到此这篇关于Python运算符+与+=的文章就介绍到这了,更多相关Python运算符+与+=内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python制作企业邮箱的爆破脚本
Oct 05 Python
Python中matplotlib中文乱码解决办法
May 12 Python
python入门前的第一课 python怎样入门
Mar 06 Python
django静态文件加载的方法
May 20 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
Python 使用指定的网卡发送HTTP请求的实例
Aug 21 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
利用Tensorflow的队列多线程读取数据方式
Feb 05 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
python 获取计算机的网卡信息
Feb 18 #Python
python中time tzset()函数实例用法
Feb 18 #Python
python中zip()函数遍历多个列表方法
Feb 18 #Python
python模块内置属性概念及实例
Feb 18 #Python
Python中的流程控制详解
Feb 18 #Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 #Python
python 爬取腾讯视频评论的实现步骤
Feb 18 #Python
You might like
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
使用python分析git log日志示例
2014/02/27 Python
Python 字符串换行的多种方式
2018/09/06 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
Django中URL的参数传递的实现
2019/08/04 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
Python如何用filter函数筛选数据
2020/03/05 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
岗位职责的含义
2013/11/17 职场文书
实习生单位鉴定意见
2013/12/04 职场文书
志愿者活动总结范文
2014/04/26 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
运动会100米加油稿
2015/07/21 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS