1. 程式人生 > >序列的 +,+=,和extend的適用場景以及區別

序列的 +,+=,和extend的適用場景以及區別

這三個都可以把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進行連線.