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连接MySQL数据库实例分析
May 12 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
利用python画一颗心的方法示例
Jan 31 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
Python实现打砖块小游戏代码实例
May 18 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
Python析构函数__del__定义原理解析
Nov 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 insert语法详解
2008/06/07 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
介绍Python中几个常用的类方法
2015/04/08 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
机械系大学毕业生推荐信
2013/11/27 职场文书
员工评语大全
2014/01/19 职场文书
模具数控专业自荐信
2014/01/27 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
商场中秋节活动方案
2014/02/07 职场文书
应届生面试求职信
2014/07/02 职场文书
家长反馈意见及建议
2015/06/03 职场文书
建筑工程催款函
2015/06/24 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL
hive数据仓库新增字段方法
2022/06/25 数据库