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 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
python 利用pyttsx3文字转语音过程详解
Sep 25 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
python使用Geany编辑器配置方法
Feb 21 Python
Python ATM功能实现代码实例
Mar 19 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
python获取命令行参数实例方法讲解
Nov 02 Python
Python中使用subprocess库创建附加进程
May 11 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读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
php经典趣味算法实例代码
2020/01/21 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
canvas时钟效果
2017/02/16 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python中set()函数简介及实例解析
2018/01/09 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
python中的decimal类型转换实例详解
2019/06/26 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Django实现文件上传和下载功能
2019/10/06 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
波兰珠宝品牌:YES
2019/08/09 全球购物
供应链金融服务方案
2014/05/25 职场文书
英语系本科生求职信
2014/07/15 职场文书
委托证明模板
2014/09/16 职场文书
老龙头导游词
2015/02/11 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技