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 k-近邻算法实例分享
Jun 11 Python
Python中的字典遍历备忘
Jan 17 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
基于python进行桶排序与基数排序的总结
May 29 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
Python基础知识点 初识Python.md
May 14 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
Python实现代码块儿折叠
Apr 15 Python
python右对齐的实例方法
Jul 05 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
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
用Python的urllib库提交WEB表单
2009/02/24 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python深入06——python的内存管理详解
2016/12/07 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
python3爬取数据至mysql的方法
2018/06/26 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
文案策划求职信
2014/03/18 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
研修心得体会
2014/09/04 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
校园安全学习心得体会
2016/01/18 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
Django路由层如何获取正确的url
2021/07/15 Python