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计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 Python
python抓取网页图片并放到指定文件夹
Apr 24 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
python3去掉string中的标点符号方法
Jan 22 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
Python使用pymysql模块操作mysql增删改查实例分析
Dec 19 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
python3 logging日志封装实例
Apr 08 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
星际争霸秘籍
2020/03/04 星际争霸
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
JavaScript操作cookie类实例
2015/03/31 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
详解Python中的Cookie模块使用
2015/07/06 Python
简单理解Python中的装饰器
2015/07/31 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Django权限机制实现代码详解
2018/02/05 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
python for 循环获取index索引的方法
2019/02/01 Python
django 简单实现登录验证给你
2019/11/06 Python
PHP如何设置和取得Cookie值
2015/06/30 面试题
建筑学推荐信
2013/11/03 职场文书
迟到检讨书500字
2014/02/05 职场文书
高一新生军训感言
2014/03/02 职场文书
党员创先争优活动总结
2014/05/04 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
抗震救灾标语
2014/06/26 职场文书
客房服务员岗位职责
2015/02/09 职场文书
尼克胡哲观后感
2015/06/08 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python