溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中元組和列表有什么區(qū)別

發(fā)布時間:2020-08-24 15:32:20 來源:億速云 閱讀:193 作者:Leah 欄目:編程語言

python中元組和列表的有什么區(qū)別?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

Python列表和元組的詳細區(qū)別

一、列表和元組的區(qū)別

列表是動態(tài)數(shù)組,它們不可變且可以重設長度(改變其內(nèi)部元素的個數(shù))。

元組是靜態(tài)數(shù)組,它們不可變,且其內(nèi)部數(shù)據(jù)一旦創(chuàng)建便無法改變。

元組緩存于Python運行時環(huán)境,這意味著我們每次使用元組時無須訪問內(nèi)核去分配內(nèi)存。

這些區(qū)別結(jié)實率兩者在設計哲學上的不同:

列表可被用于保存多個互相獨立對象的數(shù)據(jù)集合

元組用于描述一個不會改不安的事務的多個屬性


列表一旦創(chuàng)建了我們就可以根據(jù)自己的需要隨意改變它的內(nèi)容:

>>> l = [1, 2, 3, 4, 5, 6]
>>> l[0] = l[2] * l[3]
>>> l
[12, 2, 3, 4, 5, 6]

另外我們可以給列邊添加新的數(shù)據(jù)來增加其大?。?/p>

>>> len(l)
6
>>> l.append(7)
>>> l
[12, 2, 3, 4, 5, 6, 7]
>>> len(l)

這是因為動態(tài)數(shù)組支持resize操作,可以增加數(shù)組的容量。當一個大小為N的列表第一次需要添加數(shù)據(jù)時,Python會創(chuàng)建一個新的列表,足夠放原來的N個元素以及額外添加的元素。不過,實際分配的并不是N+1個元素,而是M個元素,M > N, 這是為了給未來的添加預留空間。然后舊列表的數(shù)據(jù)被復制到新列表中,舊列表則會被銷毀。從設計理念上來說,第一次添加可能是后續(xù)多次添加的開始,通過預留空間的做法,我們就可以減少這一分配空間的操作次數(shù)以及內(nèi)存復制的次數(shù)。這點非常重要,因為內(nèi)存復制可能非常的昂貴,特別是當列表大小開始增長以后。

三、元組(Tuple)

元組是固定且不可改變的。這意味著一旦元組被創(chuàng)建,和列表不同,它的內(nèi)容無法被修改或它的大小也無法被改變。

>>> t = (1, 2, 3, 4)
>>> t[0] = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

雖然它們不支持改變大小,但是我們可以將兩個元組合并成一個新元組。這一操作類似列表的resize操作,但我們不需要為新生的元組分配任何額外的空間:

>>> t1 = (1, 2, 3, 4)
>>> t2 = (5, 6, 7, 8)
>>> t1 + t2
(1, 2, 3, 4, 5, 6, 7, 8)

如果我們將其與列表的append操作比較,我們會看到它的復雜度是O(n)而不是列表的O(1)。這是因為對元組每添加一個新元素都會有分配和復制操作,而不是像列表那樣僅在額外的空間耗盡時發(fā)生。所以元組并沒有提供一個類似append的自增操作,任意兩個元組相加始終返回一個新分配的元組。

該網(wǎng)站為Python Tutor,一個能夠?qū)ython運行內(nèi)存可視化的網(wǎng)站,非常適合初學者研究,在運行過程中內(nèi)存發(fā)生了什么。

元組的靜態(tài)特性的另一個好處體現(xiàn)在一些會在Python后臺發(fā)生的事情:資源緩存。

Python是一門垃圾收集語言,這意味著當一個變量不再被使用時,Python會將該變量使用的內(nèi)存釋放回操作系統(tǒng),以供其他程序(變量)使用。然而,對于長度為1~20的元組,即使它們不在被使用,它們的空間也不會立刻還給系統(tǒng),而是留待未來使用。這意味著當未來需要一個同樣大小的新的元組時,我們不再需要向操作系統(tǒng)申請一塊內(nèi)存來存放數(shù)據(jù),因為我們已經(jīng)有了預留的空間。

這看上去可能是個細微的好處,但是實際上是元組一個很神奇的地方:它們可以被輕松快速地創(chuàng)建,因為它們可以避免跟操作系統(tǒng)頻繁的打交道,而后者會花很長的時間。

下面舉個例子會非常直觀的說明問題

In [1]: %timeit l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
93.7 ns ± 3.33 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [2]: %timeit t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
18.5 ns ± 1.19 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

上面的示例中顯示了初始化一個列表比初始化一個元組慢了5.1倍——如果這是在一個循環(huán)中,這點差別會很快的累加起來。

看完上述內(nèi)容,你們掌握python中元組和列表的有什么區(qū)別的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI