我一直以為a+=b和a=a+b是一樣的,畢竟效果是一樣的嘛。后來我發(fā)現(xiàn)并不是這么回事?我發(fā)現(xiàn)當(dāng)變量是不可變對象時,a+=b和a=a+b是一樣的,不過我注意到了前后兩個a已經(jīng)不是同一個對象了。而當(dāng)變量是可變對象時,雖然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]
這是怎么回事呢?看了一下各位大佬寫的文章,總算是弄明白了一些。
+
操作調(diào)用的是__add__方法__add__方法會返回一個新的對象,原對象不修改。
+=
操作調(diào)用了__iadd__方法__iadd__方法直接在原對象上進行更新,該方法的返回值為None。
沒有該方法時,再嘗試調(diào)用__add__方法。
當(dāng)變量是不可變對象時,a+=b和a=a+b調(diào)用的都是__add__方法,返回的是一個新對象
當(dāng)變量是可變對象時,a+=b調(diào)用的是__iadd__方法,直接在原對象上進行更新;a=a+b調(diào)用的是__add__方法,返回一個新對象