当前位置: 首页 > 科技观察

Python中a=a+b和a+=b有什么区别?

时间:2023-03-15 15:52:43 科技观察

如果你说a+=b是a=a+b的简写,那你只对了一半,你还没有弄清楚+=运算符的真正含义。这两个操作的结果是a=a+b,但是左边的a和右边的a还是同一个对象吗?当我们不确定的时候,我们可以在Python解释器中尝试一下。>>>a=1>>>id(a)4420422336>>>a=a+2>>>id(a)4420422400>>>>>>a=1>>>id(a)4420422336>>>a+=2>>>id(a)4420422400>>>可以看出,经过这两种方法后,a与原来a的id不同,不再是同一个对象,也就是说当a是anumber,a+=b是a=a+b的简单写法,当a是列表时呢?>>>a=[1]>>>id(a)140401184850560>>>a=a+[2]>>>id(a)140401184297216>>>>>>a=[1]>>>id(a)140401184850560>>>a+=[2]>>>id(a)140401184850560>>>可以看出,当a在列表中时,a+=b,原来a中的a与id相同原来的a,说明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就地操作原始列表,无需创建新对象,性能会更高效。有时候越是简单的问题,越是被人忽视,反而隐藏着很多细节。在技??术的道路上,细节就是魔鬼,了解细节也是提升技术水平的一种方式。