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中DOM方法的动态性
Apr 11 Python
简单介绍Python中的try和finally和with方法
May 05 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
postman传递当前时间戳实例详解
Sep 14 Python
pycharm修改file type方式
Nov 19 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
Python 字符串池化的前提
Jul 03 Python
Python3爬虫中pyspider的安装步骤
Jul 29 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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
php实现点击可刷新验证码
2015/11/07 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
js操作checkbox遇到的问题解决
2013/06/29 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
python使用RNN实现文本分类
2018/05/24 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
浅谈Python type的使用
2019/11/19 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
体育教育毕业生自荐信
2013/11/21 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
个人综合鉴定材料
2014/05/23 职场文书
授权收款委托书
2014/09/23 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2015年组织部工作总结
2015/04/03 职场文书
人口与计划生育责任书
2015/05/09 职场文书
聘用合同范本
2015/09/21 职场文书
python munch库的使用解析
2021/05/25 Python