Python运算符+与+=的方法实例

 更新时间:2021年02月18日 11:29:45   作者:江湖十年  
这篇文章主要介绍了Python运算符+与+=的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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接口自动化测试数据和代码分离解析

    代码的可维护性除了代码冗余之外还有就是数据尽量不要和代码掺杂在一起,因为阅读起来会非常的凌乱;数据分离能更好的增加代码可读性和可维护性,也能更好的二次修改使用
    2021-09-09
  • Pycharm搭建Django项目详细教程(看完这一篇就够了)

    Pycharm搭建Django项目详细教程(看完这一篇就够了)

    这篇文章主要给大家介绍了关于Pycharm搭建Django项目的详细教程,想要学习的小伙伴看完这一篇就够了,pycharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,需要的朋友可以参考下
    2023-11-11
  • 用Pelican搭建一个极简静态博客系统过程解析

    用Pelican搭建一个极简静态博客系统过程解析

    这篇文章主要介绍了用Pelican搭建一个极简静态博客系统过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • django中path函数使用详解

    django中path函数使用详解

    django.urls.path是Django中用于定义URL映射规则的函数之一,本文主要介绍了django中path函数使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • python以环状形式组合排列图片并输出的方法

    python以环状形式组合排列图片并输出的方法

    这篇文章主要介绍了python以环状形式组合排列图片并输出的方法,涉及Python使用pil库操作图片的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】

    Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】

    这篇文章主要介绍了Django框架模板语言,结合实例形式总结分析了Django框架中变量,标签,过滤器,继承,html转义等相关模板语言操作技巧,需要的朋友可以参考下
    2019-05-05
  • Python中xlsx文件转置操作详解(行转列和列转行)

    Python中xlsx文件转置操作详解(行转列和列转行)

    很多时候我们处理的Excel表格并不是我们想要的样子,需要将表格的形式进行相应转换后进行数据分析操作,下面这篇文章主要给大家介绍了关于Python中xlsx文件转置操作(行转列和列转行)的相关资料,需要的朋友可以参考下
    2022-07-07
  • 详解如何将Python可执行文件(.exe)反编译为Python脚本

    详解如何将Python可执行文件(.exe)反编译为Python脚本

    将 Python 可执行文件(.exe)反编译为 Python 脚本是一项有趣的技术挑战,可以帮助我们理解程序的工作原理,下面我们就来看看具体实现步骤吧
    2024-03-03
  • 关于Python的json字符串与json模块解读

    关于Python的json字符串与json模块解读

    这篇文章主要介绍了关于Python的json字符串与json模块解读,JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等),这些特性使JSON成为理想的数据交换语言,需要的朋友可以参考下
    2023-07-07
  • Python 测试框架unittest和pytest的优劣

    Python 测试框架unittest和pytest的优劣

    这篇文章主要介绍了Python 测试框架unittest和pytest的优劣,帮助大家更好的进行python程序的测试,感兴趣的朋友可以了解下
    2020-09-09

最新评论