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爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
更新修改后的Python模块方法
Mar 03 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
简单了解python协程的相关知识
Aug 31 Python
python__name__原理及用法详解
Nov 02 Python
django model object序列化实例
Mar 13 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
Python csv文件记录流程代码解析
Jul 16 Python
python for循环赋值问题
Jun 03 Python
python通过opencv调用摄像头操作实例分析
Jun 07 Python
Python中22个万用公式的小结
Jul 21 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中调用JAVA
2006/10/09 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
Python中设置变量访问权限的方法
2015/04/27 Python
Python实现图片转字符画的示例
2017/08/22 Python
Django实现单用户登录的方法示例
2019/03/28 Python
python groupby 函数 as_index详解
2019/12/16 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
Pycharm github配置实现过程图解
2020/10/13 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
会话Bean的种类
2013/11/07 面试题
化工机械应届生求职信
2013/11/04 职场文书
建筑专业毕业生推荐信
2013/11/21 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书