思考分析Python运算中 a+=b 和 a=a+b是否相等

 更新时间:2023年04月06日 10:49:57   作者:刘志军  
这篇文章主要为大家介绍了Python运算中a+=b和a=a+b是否相等及原理思考分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

如题,先上代码

a+=b

>>> b = </code><code>[</code><code>0, 1, 2</code><code>]</code>
<code>>>> a = b
>>> a += [3]
>>> b
[0, 1, 2, 3]
>>> a
[0, 1, 2, 3]

此时a和b的结果是一样的

再看

a=a+b

>>> b = [0, 1, 2]

>>> a = b
>>> a = a + [3]
>>> b
[0, 1, 2]
>>> a
[0, 1, 2, 3]

a不等于b

显然,两者是有区别的,而且这种区别只出现在可变对象(为什么是可变对象后面再说),是什么原因造成了两者的区别呢?

+= 操作调用的是 __iadd__方法,如果对象没有该方法时,再尝试去调用__add__方法

a = [0, 1, 2]
a += [3]
# 等价于
a=a.__iadd__([3]) 
print(a) #[0, 1, 2, 3]

__iadd__方法直接在原对象a上进行更新,对于list来说,iadd返回self,最后是需要做一次看上去多余的赋值,因为python编译器在编译的时候并不知道a是什么类型,统一编译成这样兼容可变和不可变类型。

+ 操作调用__add__方法

a = [0, 1, 2]
a += [3]
# 等价于
a=a.__iadd__([3]) 
print(a) #[0, 1, 2, 3]

__add__方法会返回一个新的对象,原对象不修改,因为这里 a被重新赋值了,a指向了一个新的对象,而b还是指向原来对象,所以出现了文章开头a不等于b的情况

a = [0, 1, 2]
print(a.__add__([3]))  # [0, 1, 2, 3]
print(a)  # [0, 1, 2]

为什么前面我说这种差异只会发生的可变对象身上?因为对于不可变对象,根本没有 __iadd__方法,所以+=和+的效果是一样的,调的都是 __add__ 方法。

内置对象中,常见的不可变对象和可变对象有哪些呢?这种事情ChatGPT很擅长回答。
 

ChatGPT除了给你列出表格,还会给你解释什么是可变对象和不可变对象

可变对象是指创建后可以被修改的对象,例如列表、字典和集合等,这些对象可以增加、删除、修改其中的元素。而不可变对象则是创建后不能被修改的对象,例如数字、字符串、元组和布尔值等,这些对象在创建后不能被修改。 

需要注意的是,Python 中的一些不可变对象,例如元组和命名元组,可以包含可变对象,例如列表和字典。这意味着虽然元组本身是不可变的,但是元组中包含的可变对象可以被修改。此外,Python 中还有一些特殊的对象,例如 frozenset,它是一种不可变的集合,不能被修改。

ChaGPT绝对算是一个不折不扣的辅助编程神器

AI不会让你失业,会用AI的人才会让你失业,ChatGPT不会淘汰你,能先驾驭ChatGPT的人会淘汰你。

以上就是Python运算中 a+=b 和 a=a+b是否一样原理的思考分析详细内容,更多关于Python 运算的资料请关注脚本之家其它相关文章!

相关文章

  • 在Windows中设置Python环境变量的实例讲解

    在Windows中设置Python环境变量的实例讲解

    下面小编就为大家分享一篇在Windows中设置Python环境变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • OpenCV半小时掌握基本操作之像素加减乘除&逻辑运算

    OpenCV半小时掌握基本操作之像素加减乘除&逻辑运算

    这篇文章主要介绍了OpenCV基本操作之像素加减乘除&逻辑运算,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 用Python编写一个简单的CS架构后门的方法

    用Python编写一个简单的CS架构后门的方法

    今天小编就为大家分享一篇关于用Python编写一个简单的CS架构后门的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-11-11
  • Python实现发送带有pdf附件的电子邮件

    Python实现发送带有pdf附件的电子邮件

    使用Python发邮件,是个简单的话题,可是如何可以优雅的轻松的群发邮件,并附加PDF附件,是很多小伙伴的日常工作。本文就来和大家分享一下实现方法,需要的可以参考一下
    2023-02-02
  • Python学习笔记之os模块使用总结

    Python学习笔记之os模块使用总结

    这篇文章主要介绍了Python学习笔记之os模块使用总结,本文总结了多个常用方法,需要的朋友可以参考下
    2014-11-11
  • Python实现企业微信机器人每天定时发消息实例

    Python实现企业微信机器人每天定时发消息实例

    这篇文章主要介绍了Python实现企业微信机器人每天定时发消息实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Django与JS交互的示例代码

    Django与JS交互的示例代码

    本篇文章主要介绍了Django与JS交互的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • pytorch 准备、训练和测试自己的图片数据的方法

    pytorch 准备、训练和测试自己的图片数据的方法

    这篇文章主要介绍了pytorch 准备、训练和测试自己的图片数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 在python中解决死锁的问题

    在python中解决死锁的问题

    这篇文章主要介绍了在python中解决死锁的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Python中endswith()函数的基本使用

    Python中endswith()函数的基本使用

    这篇文章主要介绍了Python中endswith()函数的基本使用,是Python学习当中的基础知识,该函数可以用来检测文件类型,需要的朋友可以参考下
    2015-04-04

最新评论