序列的 +,+=,和extend的適用場景以及區別
阿新 • • 發佈:2018-12-17
這三個都可以把list 進行連線,看下邊的程式碼 :
a=[1,2,3]
b=[4,5,6]
c=a+b
print(c)
a+=b
print(a)
列印的結果:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
大家看看了 應該沒有什麼區別,都是把列表合併了在一起. 有人說了你不是忽悠嗎,不是講區別嗎,怎麼沒有區別. 同學們看下這個程式碼,你看看是否有區別.
a=[1,2,3] b=(4,5,6) a+=b print(a) c=a+b print(c) 列印結果如下: [1, 2, 3, 4, 5, 6] File "C:/Users/tengfei.wang/PycharmProjects/Testing/testging.py", line 12, in <module> c=a+b TypeError: can only concatenate list (not "tuple") to list
說明說明呢, “+” 前後要資料型別一樣,不能list不能加tuple. 這就是區別. 那有的朋友該問了,區別顯示了,你能告訴我+=為什麼能把不同型別相加呢,能不能告訴我們原理嗎, 我聽著口氣像面試官. 好吧 ,我講下原理:需要翻開原始碼才能解釋清楚. 跟著我的節奏走,先找到 from _collections_abc import all 的 _collections_abc 模組開啟> 找到MutableSequence繼續開啟>再找到一個魔法函式iadd 如下:
def __iadd__(self, values): #+=實際用到的是iadd魔法函式 self.extend(values) #這個extend 就是關鍵 return self
我們繼續開啟這個extend 方法.
def extend(self, values):
'S.extend(iterable) -- extend sequence by appending elements from the iterable'
for v in values:
self.append(v)
看好了,這個extend傳的值 要求 是 iterable 可迭代的就行,所以這裡做了封裝 並且用了for語句 進行迴圈 append . 小夥伴明白了吧,要想學好語言,必須翻看原始碼. 同樣extend 也可以這樣用.
a=[1,2,3]
b=(4,5,6)
a.extend((9,10))
print(a)
列印結果:
[1, 2, 3, 9, 10]
面試官又來了, 既然你提到了 extend 和append 麻煩你講下它們兩個的區別吧. 我去自己給自己挖坑. 不能說不會呀,繼續上程式碼:
a=[1,2,3]
b=(4,5,6)
a.extend((9,10))
print(a)
a.append(b)
print(a)
列印結果是:
[1, 2, 3, 9, 10]
[1, 2, 3, 9, 10, (4, 5, 6)]
差異顯而易見吧,自己可以體會下 總結: +,+=, extend 都是可以把序列進行合併,但是連線的不同型別是不可以用+. +=和extend 實際原理都一樣都是用for迴圈之後再呼叫了append 方法. append 直接連線的是整體不會拆開合併,但是 extend 利用for迴圈內的append進行連線.