我一直以為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__方法,回傳一個新物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165072.html
標籤:Python
上一篇:Numpy安裝
下一篇:Python help函式
