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实现递归版汉诺塔示例(汉诺塔递归算法)
Apr 08 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 Python
通过实例了解python property属性
Nov 01 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
Python中Selenium对Cookie的操作方法
Jul 09 Python
Python与C++中梯度方向直方图的实现
Mar 17 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中使用sockets:从新闻组中获取文章
2006/10/09 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
python选择排序算法的实现代码
2013/11/21 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
python与js主要区别点总结
2020/09/13 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
函授本科自我鉴定
2013/11/03 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
司考复习计划
2015/01/19 职场文书
幼儿教师个人总结
2015/02/05 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript