当前位置: 首页 > 后端技术 > Python

Python运算符+和+=

时间:2023-03-25 21:44:16 Python

在Python中,如果需要自增一个变量,通常有两种写法,a=a+b或a+=b。这两种方法虽然可以达到相同的效果,但并不完全等同。对于语句a=a+b,加法运算符+实际上进行了两步操作,首先执行a+b求两者之和,然后通过赋值运算符=将结果赋值给变量a。看下面的例子:>>>a=100>>>b=200>>>id(a)1796532544>>>a=a+b>>>a300>>>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,可以be可以看出,无论是不可变类型还是变量类型,最终变量a的id值都会发生变化,说明执行a=a+b后变量a指向了新的内存地址。这样也比较容易理解,因为a被重新赋值了。增量赋值运算符+=对于运算符+=,我们通常称其为增量赋值运算符,因为它既完成了加法运算又完成了赋值运算。同样,我们还是用int和list这两种数据类型来演示:>>>a=100>>>b=200>>>id(a)1796532544>>>a+=b>>>a300>>>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的内存地址并没有改变,也就是说+=操作实际上是对mutable类型的原地改变。对于列表操作,a+=b实际上等同于a.extend(b)。__add__和__iadd__方法实际上,在Python中,加法运算符+对应对象的__add__方法,递增赋值运算符+=对应对象的__iadd__方法。不管是不可变类型还是可变类型,当执行a=a+b时,都会调用a的__add__方法。对于a+=b的操作,当a是不可变类型时,也会调用a的__add__方法,当a是可变类型时,会调用a的__iadd__方法进行in-placechanges。如果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__方法。