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实现博客文章爬虫示例
Feb 26 Python
python数据结构之二叉树的遍历实例
Apr 29 Python
Python 序列的方法总结
Oct 18 Python
浅谈Python中range和xrange的区别
Dec 20 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
py-charm延长试用期限实例
Dec 22 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
详解python tcp编程
Aug 24 Python
Python实现生成bmp图像的方法
Jun 13 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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
优化PHP代码的53条建议
2008/03/27 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
php利用递归实现删除文件目录的方法
2016/09/23 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
js实现拖拽功能
2017/03/01 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
朴素贝叶斯算法的python实现方法
2014/11/18 Python
Python实现的检测网站挂马程序
2014/11/30 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
2020/07/01 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
网络技术支持面试题
2013/04/22 面试题
大学生未来职业生涯规划书
2014/02/15 职场文书
工程质量月活动方案
2014/02/19 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
工作收入住址证明
2014/10/28 职场文书
迟到检讨书范文
2015/01/27 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
解决Redis启动警告问题
2022/02/24 Redis