簡體   English   中英

Python中的列表和元組有什么區別?

[英]What is the difference between lists and tuples in Python?

哪個更有效率? 每種的典型用途是什么?

列表是可變序列,有許多方法(包括變異和非變異的方法),它們通常用作通用容器(它們的項目可以是任何類型的對象,盡管它有時被認為是更好的列表樣式具有相同類型或類型的項目等效使用)。

元組是不可變的序列,只有很少的方法(所有非變異的特殊元素),當你需要不可變性以便將容器用作集合中的項目或字典中的鍵時(通過項目),最常使用這些方法也必須是不可變的 - 例如字符串,數字或其他嵌套元組,為此起作用)。 他們的項目可以是任何類型的對象,元組擁有許多不同類型的項目是完全正常的。

在一些情況下,元組或列表也可以同樣起作用,並且在少數情況下,元組更小且構建更快的事實可用於影響有利於元組的決策。 例如,當函數需要返回多個結果時,使用它是最正常的

return fee, fie, foo, fum

即,返回一個有問題的四個項目的元組,而不是

return [fee, fie, foo, fum]

也就是說,返回一個包含四個項目的列表 - 除了(小的收益)性能,“返回一個元組”常見的習慣用法也處理通常返回的多個結果不是相同的也不可互換的類型的問題,因此,從風格上來說,無論如何,使用列表可能會被認為是一個更可疑的選擇。

tuple一個有用變體是它的子類型collections.namedtuple (需要Python 2.6或更高版本),它允許您按名稱(使用屬性語法)和索引(正常方式)訪問項目。 例如,如果import collections位於模塊頂部,則上述return語句可能會變為......

freturn = collections.namedtuple('freturn', 'fee fie foo fum')

def f():
  ...
return freturn(fee, fie, foo, fum)

現在, f()的調用者可以像以前一樣使用其返回值作為元組,但是會獲得很好的替代方案,例如...:

r = f()
print r.fie

代替不那么立即清晰可讀

print r[1]

值得注意的是,與直接使用元組相比,使用collections.namedtuple創建的命名元組子類基本上沒有額外的開銷,或者正如文檔所說的那樣,

它們很輕巧,不需要比常規元組更多的內存。

列表是可變的 ,您可以向其中添加元素。 元組不是,這意味着它(稍微)更高效。 元組也是可以清除的 ,因此可以用作例如字典中的鍵。

這個

列表是可變的(可以更改),元組是不可變的。 典型用途:它聽起來相當陳腐,但是當您需要更改值時使用列表。 由於它們的不變性,元組通常效率更高一些(除非你像列表一樣使用它們並且復制它們很多......)

在閱讀了一些Python doc之后。 在內置類型上 ,我創建了下表來顯示六個可迭代容器之間的主要差異。

<pre>
Container   Notation     Index [n:m]   Mutable   Hashable
=========   ==========   ===========   =======   ========
String      ' ' or " "    position     Immutable    Yes
Range       range(,,)     position     Immutable    Yes
Tuple       (,)           position     Immutable    Yes
List        [,]           position     Yes          No
Set         {,}           No           Yes          No
Dict        {k:v,k:v}     by key       Yes          No
</pre>

set和dict的搜索速度更快,因為它們是經過哈希處理而不是排序,因此與大小無關。 元組和列表是相同的,除了元組是不可變的,方法少於列表,因此它不支持項目分配來改變其內容。 但是可以連接兩個元組以實現“附加”功能,即t1 += t2

由於只有不可變序列類型支持hash(),因此list,set和dict不能用作dict鍵。 這可以在下面很容易地看到,其中'a'是一個dict序列,它包含int,float,str,range和tuple的異類不可變鍵類型:

>>> a
{range(2, 5, 2): 'range', 3: 15, 4.5: 16, 'llmjxm': 'c', -555: 666, -4.5: -25, (5, 6, 7): 'blue', 'abc3': 215, (1, 2, 3): 'red'}
>>> for item in a.keys():
...     print(item, '\t\t==>>', a[item])
... 
range(2, 5, 2)      ==>> range
3       ==>> 15
4.5         ==>> 16
llmjxm      ==>> c
-555        ==>> 666
-4.5        ==>> -25
(5, 6, 7)       ==>> blue
abc3        ==>> 215
(1, 2, 3)       ==>> red
>>> 

而可變類型的鍵將導致TypeError:

>>> a[{5}] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> a[[5]] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> a[{5:6}] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> a[-555] = 666
>>> 

有關更多詳細信息,請參閱link1link2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM