Python中的a+=b和a=a+b之间的区别是什么?
程序员文章站
2022-05-11 08:04:31
我一直以为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+=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__方法,返回一个新对象