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 相关文章推荐
Django发送html邮件的方法
May 26 Python
Python的净值数据接口调用示例分享
Mar 15 Python
利用python画一颗心的方法示例
Jan 31 Python
python中的闭包函数
Feb 09 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
python实现kmp算法的实例代码
Apr 03 Python
python文件操作的简单方法总结
Nov 07 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
Python的collections模块真的很好用
Mar 01 Python
如何利用python创作字符画
Jun 25 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
php4与php5的区别小结(配置异同)
2011/12/20 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php生成扇形比例图实例
2013/11/06 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
围观tangram js库
2010/12/28 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python中偏函数用法示例
2018/06/07 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
Collection和Collections的区别
2016/05/02 面试题
介绍一下内联、左联、右联
2013/12/31 面试题
财务人员的自我评价范文
2014/03/03 职场文书
投资意向书
2014/07/30 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
员工2014年度工作总结
2014/12/09 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS