python中a+=a和a=a+a的區別
阿新 • • 發佈:2018-08-11
tuple 圖片 影響 變量 9.png 更改 .com fonts 自身
+= 是 + 的一種升級版本, 具有能把執行後的結果再寫回傳遞來的變量本身的功能, 可變變量自身有比不可變變量多一個魔法方法 _iadd_, += 操作調用 _iadd_方法,沒有該方法時,再嘗試調用_add_方法, 不可變變量沒有_iadd_方法
舉例:
# a += b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 += [3]
>>> a1
[0, 1, 2, 3]
>>> a2
[0, 1, 2, 3]
# a = a + b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 = a2 + [3]
>>> a1
[0, 1, 2]
>>> a2
[0, 1, 2, 3]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
a1 = [0, 1, 2]
a1 += [3] <==> a1.__iadd__([3])
print(a1) # [0, 1, 2, 3]
- 1
- 2
- 3
_iadd_方法直接在原對象 a1 上進行更新,該方法的返回值為None
+ 操作調用add方法
a1 = [0, 1, 2]
a1 = a1 + [3] <==> a1 = a1.__add__([3])
- 1
- 2
_add_方法會返回一個新的對象,原對象不修改,因為這裏 a1被重新賦值了,a1指向了一個新的對象
再舉一個栗子, 你能判斷並明白出下面的輸出結果嗎?:
+=
In [1]: def selfAdd(a):
...: a += a
...: print(a)
...:
In [2]: a_int = 1
# 傳入不可變變量
In [3]: selfAdd(a_int)
2
# 不可變變量本身沒有發生改變
In [4]: a_int
Out[4]: 1
In [6]: a_li = [1,2]
# 傳入可變變量
In [7]: selfAdd(a_li)
[1, 2, 1, 2]
# += 後,可變變量內容發生改變
In [8]: a_li
Out[8]: [1, 2, 1, 2]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
=+
In [5]: def selfAdd2(a):
...: a = a+a
...: print(a)
...:
# 傳入不可變變量
In [10]: selfAdd2(a_int)
2
# 如所料的沒有改變
In [11]: a_int
Out[11]: 1
# 傳入可變變量
In [12]: selfAdd2(a_li)
[1, 2, 1, 2]
# =+ 後,沒有發生改變
In [13]: a_li
Out[13]: [1, 2]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
這裏還要註意:
Python中函數參數是引用傳遞(不是值傳遞)。對於不可變類型,因變量不能修改,所以運算不會影響到變量自身;而對於可變類型來說,函數體中的運算有可能會更改傳入的參數變量。
舉例:
In [51]: def count():
...: fs = []
...: for i in range(1,4):
...: def f():
...: return i*i
...: fs.append(f)
...: return fs
...: for f in count():
...: print(f())
...:
9
9
9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
第一、可以看到打印結果全是9, 傳遞時函數的應用或者叫地址(這裏 python 是高級語言, 主要面向開發應用的, 其實並不追究底層)
第二、函數中前面聲明並定義過程中, 並沒有把之前的 i 值保存下來, 循環結束後, 函數中保留的只有最後一次傳遞進來的值:3
第三、故, 循環調用函數時, 每次打印的都是 3*3 的結果: 9
- 可變類型,值可以改變:
- 列表 list
- 字典 dict
- 不可變類型,值不可以改變:
- 數值類型 int, long, bool, float
- 字符串 str
- 元組 tuple
- 喜歡的朋友可以加QQ群,群內有免費資料供大家一起交流學習哦!!!
python中a+=a和a=a+a的區別