我一直以为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__方法,返回一个新对象

来源:https://www.cnblogs.com/CharrammaBlog/p/12567797.html

python中a* b是什么意思_Python中的a+=b和a=a+b之间的区别是什么?相关推荐

  1. python的a b是什么意思_python – `a,b = b,a b`和`a = b之间的区别是什么? b =斐波那契的b` [复制]...

    以前在我写斐波那契函数时,我试图替换 a, b = b, a+b 同 a = b b = a + b 相信它是一样的但我注意到输出是不同的(和错误的) 这两个代码不应该做同样的事情吗? 这是完整的代码 ...

  2. python之33个关键字详解_Python 中的关键字 with 详解

    在 Python 2.5 中,with关键字被加入.它将常用的 try ... except ... finally ...模式很方便的被复用.看一个最经典的例子: with open('file.t ...

  3. python中字典和集合的区别_Python中字典和集合学习小结

    映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元组等 包含可变对象的列表. ...

  4. python 函数参数前面两个星号_Python中参数前面一个星号两个星号(*参数,**参数)起什么作用呢?...

    摘要: 下文讲述Python中参数前面一个星号两个星号的功能分享,如下所示: 在Python语言中,我们经常看见参数前面 加上一个星号或两个星号 那么这些写法到底起什么作用呢? 下文将一一道来,如下所 ...

  5. python异常处理时所使用的保留字_Python中,下列哪个保留字不用于异常处理______________。_学小易找答案...

    [单选题]维持细胞生存所必需的最基本的基因是 ( ) [单选题]从体细胞克隆高等哺乳动物的成功说明了 ( ) [单选题]细胞决定与细胞分化的关系是 ( ) [多选题]一种类型的分化细胞转变成另-种类型 ...

  6. python中的列表是指针吗_Python中的指针——到底指什么(二)

    在 Python中的指针--到底指什么(一) 中,我们知道在Python的一切都是对象,变量其实是指向PyObject对象的名称,对不可变变量进行操作后,名称指向了另一个PyObject. 扣留对象 ...

  7. python中遍历字典判断是否存在_python中如何判断值在不在字典中

    python中判断值在不在字典中的方法:我们可以通过for循环来进行判断.在python中for循环可以遍历任何序列的项目.语法结构:[for iterating_var in sequence:st ...

  8. python里删除range里的数字_python中range函数与列表中删除元素

    一.range函数使用 range(1,5)   代表从1到4(不包含5),结果为:1,2,3,4   ,默认步长为1 range(1,5,2)   结果为:1, 3  (同样不包含5) ,步长为2 ...

  9. python语言中print函数的作用_python中如何使用print函数

    Python中print语句 1.逗号分隔符 在Python中print语句可根据sys.stdout中包含的文件生成输出,它接受一个逗号分隔的对象表,如下实例:x = 1 y = 2 z = 3 p ...

  10. python 变量赋值是引用和拷贝_Python 中变量赋值传递时的引用和拷贝

    曾经看到这样一个问题,一个字典中的元素是列表,将这个列表元素赋值给一个变量,然后修改这个列表中元素的值,结果发现,字典中那个列表也同样修改了.那个问题如下: dict = {'a':[1,2,3,4, ...

最新文章

  1. linux基础篇-02,linux时间管理date hwclock cal 简述
  2. Design Pattern - Prototype(C#)
  3. EditText控件的基本使用(点击Button按钮,Toast提示EditText中的内容)
  4. mysql测试spring事务是否生效
  5. (六)Vue3.0预学习
  6. vb.net 的 openFileDialog 控件文件筛选器使用
  7. iPhone 13临近发布,富士康需要在9月底前再招聘20万名工人
  8. winfrom下,如何实现类似QQ右下角弹出新闻
  9. 服务器电源控制芯片,服务器电源中的PFC控制芯片HA16141的应用.pdf
  10. [bzoj4945][Noi2017]游戏
  11. linux 系统信号忽略和system函数返回值问题(system的实现)
  12. opencv计算图像亮度调节_图像数据集增强方式总结和实现【数字图像处理系列四】...
  13. VBA代码自动缩进排版-VBA代码助手一键排版功能
  14. 卡片游戏 (Throwing cards away I)(队列+模拟)
  15. JavaScript使用百度地图API获取当前位置信息
  16. 产品销售份额数据统计流程图模板分享
  17. 提高效率5款多功能实用软件推荐
  18. Linux之进程的前后台切换
  19. MySQL自定义函数的使用及MySQL中的流程控制语句
  20. 数据挖掘算法之关联规则挖掘(二)FPGrowth算法

热门文章

  1. 开源 免费 java CMS - FreeCMS1.5-数据对象-guestbook
  2. 文件的上传下载功能的实现(包括进度条)[telerik控件]
  3. 程序员专属段子集锦 2/10
  4. 震惊,杨幂的脸竟然出现在了她的身体上
  5. java判断包含关系contains方法的使用
  6. pytorch版本问题:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'
  7. ubantu系统之快捷键使用
  8. Android 相关翻译
  9. [安全测试报告]针对某厂商的一次渗透性测试
  10. 常用技巧性CSS:颜色渐变,截断英文单词,阴影文字.