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中使用base64模块处理字符编码的教程
Apr 28 Python
Python循环语句之break与continue的用法
Oct 14 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
简单了解Pandas缺失值处理方法
Nov 16 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
详解Python中第三方库Faker
Sep 25 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
提取视频中的音频 Python只需要三行代码!
May 10 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
Python实现的购物车功能示例
2018/02/11 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
婚前财产协议书范本
2014/10/19 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
2015年中秋寄语
2015/07/31 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
Python find()、rfind()方法及作用
2022/12/24 Python