Python运算符+与+=的方法实例
Python中如果需要对一个变量进行增量运算通常有两种写法,a=a+b或a+=b。虽然两种方法能够得到同样的结果,但两者却并不完全等价。
加法运算符+
对于a=a+b这条语句来说,实际上执行了两步操作,首先执行a+b求出两者的和,然后再将结果通过赋值运算符=赋值给变量a。
来看下面的示例:
>>>a=100 >>>b=200 >>>id(a) 1796532544 >>>a=a+b >>>a 300 >>>id(a) 17756816
>>>a=[11,22,33] >>>b=[44,55,66] >>>id(a) 54675856 >>>a=a+b >>>a [11,22,33,44,55,66] >>>id(a) 54676416
以上分别使用Python中的不可变类型和可变类型各列举了一个示例,并且在执行a=a+b语句的前后分别打印了变量a的id,可以看到无论对于不可变类型还是可变类型,最终变量a的id值都会改变,说明变量a在执行a=a+b以后指向了一片新的内存地址。这也比较好理解,因为a已经被重新赋值了。
增量赋值运算符+=
对于运算符+=,我们通常管它叫作增量赋值运算符,因为它即完成了相加操作,又完成了赋值操作。
同样,我们还是分别用int和list两种数据类型来做演示:
>>>a=100 >>>b=200 >>>id(a) 1796532544 >>>a+=b >>>a 300 >>>id(a) 17756784
>>>a=[11,22,33] >>>b=[44,55,66] >>>id(a) 48777616 >>>a+=b >>>a [11,22,33,44,55,66] >>>id(a) 48777616
对于不可变类型的操作,a+=b表现出来的结果和a=a+b相同。而对于可变类型的操作却并不完全一样。虽然最终变量a的值相同,但执行+=操作后,变量a的内存地址并没有改变,也就是说+=操作对于可变类型来说实际上是就地更改。对于list的操作,实际上a+=b等价于a.extend(b)。
__add__和__iadd__方法
实际上,在Python中,加法运算符+对应着对象的__add__方法,增量赋值运算符+=对应着对象的__iadd__方法。
无论对于不可变类型还是可变类型,当执行a=a+b时,都会调用a的__add__方法。而对于a+=b的操作来说,当a为不可变类型时同样会调用a的__add__方法,当a为可变类型时会调用a的__iadd__方法进行就地更改,如果a没有实现__iadd__方法,那么才调用a的__add__方法。
我们可以用Python内置的hasattr函数来验证上面的说法。
>>>hasattr(int,'__add__') True >>>hasattr(int,'__iadd__') False >>>hasattr(list,'__add__') True >>>hasattr(list,'__iadd__') True
对于不可变类型来说,因为对象本身不可变,如果做相加操作必然会创建新的对象,所以也就没有__iadd__方法。而对于可变类型来说,对象本身可变,所以实现了__iadd__方法。
在我们自己定义的类型中如果需要实现以上两个方法,也要遵循Python现有的规范,一定要注意自己实现的类型是否可变,根据类型再来确定是否需要实现__iadd__方法。
总结
到此这篇关于Python运算符+与+=的文章就介绍到这了,更多相关Python运算符+与+=内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。