我一直以为a+=b和a=a+b是一样的,毕竟效果是一样的嘛。后来我发现并不是这么回事?我发现当变量是不可变对象时,a+=b和a=a+b是一样的,不过我注意到了前后两个a已经不是同一个对象了。而当变量是可变对象时,虽然a+=b和a=a+b的效果是一样的,但是a=a+b前后的两个a也不是同一个对象了,而a+=b前后两个a还是同一个对象。

# 不可变对象

# a+=b 前后的a不是同一个对象

>>> a=1

>>> b=2

>>> id(a)

140722530604704

>>> a+=b

>>> id(a)

140722530604768

>>> print(a)

3

# a=a+b 前后的a也不是同一个对象

>>> a=1

>>> b=2

>>> id(a)

140722530604704

>>> a=a+b

>>> id(a)

140722530604768

>>> print(a)

3

# 可变对象

# a+=b 前后的a是同一个对象

>>> a=[1,2]

>>> b=[3,4]

>>> id(a)

214391266944

>>> a+=b

>>> id(a)

214391266944

>>> print(a)

[1, 2, 3, 4]

# a=a+b 前后的a不是同一个对象

>>> a=[1,2]

>>> b=[3,4]

>>> id(a)

2143494790272

>>> a=a+b

>>> id(a)

2143494790592

>>> print(a)

[1, 2, 3, 4]

这是怎么回事呢?看了一下各位大佬写的文章,总算是弄明白了一些。

+操作调用的是__add__方法

__add__方法会返回一个新的对象,原对象不修改。

+=操作调用了__iadd__方法

__iadd__方法直接在原对象上进行更新,该方法的返回值为None。

没有该方法时,再尝试调用__add__方法。

不可变对象只有__add__方法,没有__iadd__

可变对象有__add__方法,也有__iadd__

结论

当变量是不可变对象时,a+=b和a=a+b调用的都是__add__方法,返回的是一个新对象

当变量是可变对象时,a+=b调用的是__iadd__方法,直接在原对象上进行更新;a=a+b调用的是__add__方法,返回一个新对象

python中a%b_Python中的a+=b和a=a+b之间的区别是什么?相关推荐

  1. c语言中优先级劣后级,基金优先级与劣后级之间的区别是什么?

    基金优先级与劣后级之间的区别是什么? 那些喜欢买进基金或对基金有一定了解的投资者可能会听到基金的优劣.这些词都是基金的专业术语,很多小伙伴还不明白具体的含义,下面就听小编为大家简单介绍一下. 何谓基金 ...

  2. 使用Python,EoN模拟网络中的疾病扩散模型,并结合matplotlib绘图

    使用Python,EoN模拟网络中的疾病扩散模型,并结合matplotlib绘图 1. EoN是什么 2. 安装 3. 效果图 4. 源代码 4.1 源码 4.2 源码 参考 写这篇博客源于博友的提问 ...

  3. 使用Python,OpenCV在视频中进行实时条形码检测

    使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...

  4. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  5. python缩进在程序中长度统一且强制使用_Python习题纠错1

    February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...

  6. python中json dumps_python中json.loads,dumps,jsonify使用

    search_info = {'id':132,'user_role':3} print type(search_info) #输出 #转为string用dumps print type(json.d ...

  7. python io模块_python中的StringIO模块

    原博文 2015-10-23 15:21 − # python中的StringIO模块 标签:python StringIO --- > 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的, ...

  8. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  9. python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation)

    python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation Funct ...

最新文章

  1. redis 内存不足 排查_一文深入了解 Redis 内存模型,Redis 的快是有原因的!
  2. GFS - The Google File System
  3. 十天学会PHP(第五版),十天学会php之第五天
  4. django-验证码
  5. 原生JavaScript练习——全选
  6. 蚂蚁Java高端培训视频教程-每特学院,蚂蚁课堂
  7. 【线性模型引论】王松桂著 课后习题2.2参考答案
  8. 客户信息管理系统----Java实现(以对象数组为主)
  9. java程序启动端口_查看项目端口和启动情况
  10. A类业余电台操作证书考试内容提要
  11. vue 怎么解析xml
  12. mysql timestamp 差值_SQL计算timestamp的差值实例分享
  13. Commonjs 模块化开发解析
  14. 如何在微信小程序中下载APP?
  15. 【虚幻引擎UE】UE5 简单实现范围计算并绘制圆圈
  16. Effective C++ T23:宁以non-member、non-friend替换member函数
  17. 1-50可复制到word文档外带圈的数生成方法
  18. DB2查看执行过长的SQL
  19. 04Java注解和反射
  20. 【数据结构算法】递归:八皇后问题

热门文章

  1. 设计模式 C++工厂方法模式
  2. 各种水龙头拆卸图解_[各种水龙头拆卸图解]水龙头漏水怎么办
  3. python生成热度图_Python数据可视化 热力图
  4. java 无符号整数_如何在java 8中使用无符号整数?
  5. php ajax.open的 url路径,php – 检测Ajax调用URL
  6. mysql统计每个科目平均成绩_No.03 数据库经典面试之如何取出每科成绩的前三名...
  7. 所有受限制的应用程序包_您需要了解的有关Mac的Apple新款M1芯片的所有信息
  8. http和restful知识点查阅
  9. 太阳直射点纬度计算公式_高中地理,常用计算公式大盘点,高中满分特辑!
  10. 网络驱动器映射成功但无法更新文件_我的电脑访问NAS像打开本地硬盘那样打开网络NAS...