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网络编程学习笔记(10):webpy框架
Jun 09 Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
详解python的几种标准输出重定向方式
Aug 15 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
python验证身份证信息实例代码
May 06 Python
Mac安装python3的方法步骤
Aug 09 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
用python画城市轮播地图
May 28 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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
example2.php
2006/10/09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
php adodb分页实现代码
2009/03/19 PHP
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
jquery select下拉框操作的一些说明
2010/04/02 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
讲解Python中的递归函数
2015/04/27 Python
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
对Django外键关系的描述
2019/07/26 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
python excel多行合并的方法
2020/12/09 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
审核会计岗位职责
2013/11/08 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
义和团口号
2014/06/17 职场文书
学校读书活动总结
2014/06/30 职场文书
中秋节晚会开场白
2015/05/29 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers