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求pi的方法
Oct 08 Python
Python类的用法实例浅析
May 27 Python
python实现用户答题功能
Jan 17 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
Python os模块常用方法和属性总结
Feb 20 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
python 统计list中各个元素出现的次数的几种方法
Feb 20 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的正则处理函数总结分析
2008/06/20 PHP
php无限遍历目录示例
2014/02/21 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
js实现点击烟花特效
2020/10/14 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
运动会领导邀请函
2014/01/10 职场文书
便利店投资创业计划书
2014/02/08 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
个人整改措施书面材料
2014/10/24 职场文书
中学生自我评价2015
2015/03/03 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
MySQL分区路径子分区再分区
2022/04/13 MySQL
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS