Python 中 a=a+b 与 a+=b 有什么不同?

开发 后端
只要熟悉 Python,那么你肯定知道 a=a+b 与 a+=b 都可以实现对对象 a 的自增操作,可以除此之外,他们有什么不同呢?如果这个是面试题,你会怎么回答呢?

 如果你说 a+=b 是 a=a+b 的简单写法,那你只说对了一半,你还没有弄清楚 += 这种操作符的真正含义。

[[416063]]

这两种操作的结果都是 a=a+b, 但左边的 a 和 右边的 a 还是同一个对象么?当弄不清楚的时候,我们可以在 Python 解释器中试验一下。

  1. >>> a = 1 
  2. >>> id(a) 
  3. 4420422336 
  4. >>> a = a + 2 
  5. >>> id(a) 
  6. 4420422400 
  7. >>> 
  8. >>> a = 1 
  9. >>> id(a) 
  10. 4420422336 
  11. >>> a += 2 
  12. >>> id(a) 
  13. 4420422400 
  14. >>> 

可以看出,两种方式之后,a 与原来的 a 的 id 不同,它们不再是同一个对象,也就是说当 a 是数字的时候,a+=b 是 a=a+b 的简单写法,那么当 a 是列表的时候呢?

 

  1.  >>> a = [1] 
  2. >>> id(a) 
  3. 140401184850560 
  4. >>> a = a + [2] 
  5. >>> id(a) 
  6. 140401184297216 
  7. >>> 
  8. >>> a = [1] 
  9. >>> id(a) 
  10. 140401184850560 
  11. >>> a += [2] 
  12. >>> id(a) 
  13. 140401184850560 
  14. >>> 

可以看出,当 a 是列表时,a += b,中的 a 与原来的 a 的 id 是同一个,说明 a += b 并没有创建新的对象,而 a = a+b 新创建了一个新的对象,创建对象是有成本的,因此在这种情况下, a+=b 的性能是比较高的,这一点可以验证:

 

两种方法都执行 10 万次时,性能相差 1900 倍。

总结一下,对不可变对象, a+=b 就是 a=a+b 的简单写法,比如数字,字符串,元组。请注意,元组也是可以 a+=b、a=a+b 的哦,元组的不可变,指的是这个元组指向的对象不可变,但是元组变量却是可以指向新的元组的。

对于可变对象,a+=b 在 a 的基础上进行自增,不创建新对象,而 a=a+b,创建了新的对象,然后再让变量 a 指向这个新创建的对象,涉及创建对象的操作,因此性能较差。可变对象有列表,字典,集合,类似的,a=a*b 与 a*=b 也是一样的,不过只有列表才支持 + 和 * 这种运算符。

最后的话

现在你应该明白了 a=a+b 与 a+=b, a=a*b 与 a*=b 的区别。对于列表而言,a*=b、a*=b是在原有列表上原地进行操作,不创建新的对象,性能会更高效。

有时候越简单的问题,越是被人忽略,却藏着不少细节,技术的道路上,细节是魔鬼,搞懂细节,也是提升技术水平的方法。

责任编辑:华轩 来源: Python七号
相关推荐

2014-08-18 13:35:24

LinuxBSD

2022-01-17 10:56:59

容器PodmanDocker

2014-06-12 19:38:29

LinuxBSD

2017-03-23 18:24:41

CentOSUbuntuLinux

2022-04-14 18:14:56

元宇宙B2B互联网

2010-11-23 10:33:22

ATMMPLSSONET

2018-06-26 14:29:44

LinuxUnix不同

2020-09-25 18:10:06

Python 开发编程语言

2015-10-12 11:00:23

编程学校工作

2019-09-24 09:33:53

MySQLB+树InnoDB

2019-12-31 09:33:03

MongoDBB 树NoSQL

2011-01-21 10:16:40

chromeweb apps

2023-01-09 07:30:19

人工智能B2B交易

2021-07-12 23:53:22

Python交换变量

2021-03-11 19:14:42

Java常量池元空间

2020-07-15 09:29:23

Python开发工具

2012-05-29 13:15:04

B2B

2013-09-26 11:22:34

Informatica
点赞
收藏

51CTO技术栈公众号