python 中a b與a a b有什麼區別

2021-07-27 22:29:19 字數 2276 閱讀 7360

看到乙個比較有意思的問題,就是python中a+=b與a=a+b有什麼區別

總體上講,a+=b是改變了a原始的值,而a=a+b是計算出a+b後,a在指向那個值。這個也跟a和b的型別有關。當a和b是int或者string不可改變的時候,二者效果一樣。

>>> a=[1,2,3,4] 

>>> b=a

>>> a+=[5]

>>> a,b

([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])#a,b的「位址」一樣

>>> a=[1,2,3,4]

>>> b=a

>>> a=a+[5]#a+[5]後有乙個新位址,再使a指向這個新位址,因此a不再是以前的a,而b還是以前的那個a//b,所以b不變

>>> a,b

([1, 2, 3, 4, 5], [1, 2, 3, 4])

>>> a=[[1],[2]] 

>>> b=

>>> b+=a[0:1]#這句將列表a中第乙個元素的「指標」給了b[0],此時a[0]和b[0]是一樣的

>>> a,b

([[1], [2]], [[1]])

>>> b[0][0]='change'#b[0]就相當於取到了a裡面的第乙個元素,也是乙個列表。b[0][0]也就定位到了a[0][0],對應的內容就是1

>>> a,b

([['change'], [2]], [['change']])#因此b[0][0]改了,a[0][0],也相應的改了。

>>> id(b[0][0]);id(a[0][0])#不用說,位址一樣

11534048

11534048

>>> id(b[0]);id(a[0])

12903888

12903888

>>> b[0],a[0]

(['change'], ['change'])

>>> b[0]='another'#這裡應該是有一塊新位址,再讓b[0]指向這個新位址。

>>> a,b

([['change'], [2]], ['another'])# 因此a中的值沒有變

>>> a[0]

['change']

>>> id(b[0]);id(a[0]) #此時,b[0]跟a[0]的位址不一樣

13056672

12903888

>>> a=[1,2]#初始化a,為列表[1,2]

>>> a+='3' #直接+=方式,追加元素」3」

>>> a

[1, 2, '3']

>>> a+=['4'] #追加列表,比上面的『3』 多了個。

>>> a

[1, 2, '3', '4']#同樣能追加成功,怎麼感覺有無沒有區別啊?

>>> a+'5'#當然,直接+字串,就拋異常了。

traceback (most recent call last):

file "", line 1, in typeerror: can only concatenate list (not "str") to list

要解釋這個問題,看看python裡的原始碼即可。知道+=這個操作實際上是呼叫了__iadd__方法(可以用此過載操作符,stackoverflow上有這個過載+=的問題).而在__iadd__方法內部,是直接呼叫了extend()方法,而a.extend(『3』)和a.extend([『3』])沒有區別嗎?表面上看來是沒有區別的。

>>> a=[1,2]

>>> a.extend('3')

>>> a

[1, 2, '3']

>>> a.extend(['3'])

>>> a

[1, 2, '3', '3']

def extend(self, values):

for v in values:

>>> a

[1, 2, '3', '3']

>>> a.extend('abc')

>>> a

[1, 2, '3', '3', 'a', 'b', 'c']

>>> a.extend(['23','ab'])

>>> a

[1, 2, '3', '3', 'a', 'b', 'c', '23', 'ab']

參考文獻:

a a b 與 a b 的區別

1 對於同樣型別的a,b來說 兩個式子執行的結果確實沒有什麼區別。但是從編譯的角度看吧 武讓說的 a b 執行的時候效率高。2 對於不同型別的a,b來說 2.1 不同型別的兩個變數在進行運算的時候,我們經常說到的是型別的轉換問題。這裡,記住兩點 一 運算過程中,低精度的型別向高精度型別轉換。二 如果...

python 中sorted與sort有什麼區別

sort cmp none,key none,reverse false sorted iterable,cmp none,key none,reverse false sort是容器的函式,用list的成員函式sort進行排序 sorted是python的內建函式相同的引數,用built in函式...

Java中 a a b 和 a b 的區別

千萬不要放過任何乙個小的知識點 乙個這麼小的點也可以拿來寫一篇文章 哈?首先網傳 a b 的效率會比 a a b 的效率要高一點,但是我驗證了一下,好像並沒有這回事。執行 1000000000 次 a a 1的時間和 a 1的時間幾乎差不多,而且有時候前者快,有時候後者快。這裡就不討論效率高低這個區...