1. 程式人生 > >python中a+=a和a=a+a的區別

python中a+=a和a=a+a的區別

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的區別