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中捕捉详细异常信息的代码示例
Sep 18 Python
用Python程序抓取网页的HTML信息的一个小实例
May 02 Python
qpython3 读取安卓lastpass Cookies
Jun 19 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
python中的协程深入理解
Jun 10 Python
Python求正态分布曲线下面积实例
Nov 20 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python列表解析操作实例总结
Feb 26 Python
详解python程序中的多任务
Sep 16 Python
python中pycryto实现数据加密
Apr 29 Python
Python如何加载模型并查看网络
Jul 15 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执行速度全攻略
2006/10/09 PHP
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
python中bisect模块用法实例
2014/09/25 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
平民服装店创业计划书
2014/01/17 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
项目经理任命书
2014/06/04 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
小学班长竞选稿
2015/11/20 职场文书
2015元旦感言
2015/12/09 职场文书
创业计划书之寿司
2019/07/19 职场文书
七年级作文之游记
2019/12/11 职场文书
redis缓存存储Session原理机制
2021/11/20 Redis