標籤:

Python 中列表和元組有哪些區別?

列表功能比元組強很多,而且功能都包含了,而且元組甚至還不能夠修改。元組的存在意義是什麼?


類似的問題, 建議題主移步 StackOverflow 或者 python doc

- python - What"s the difference between list and tuples?

- 5. Data Structures

----------------------

翻譯部分觀點如下:

  1. Tuples are immutable, lists are mutable.

元組是不可變的, 而列表是可變的。

2. Tuples areheterogeneous data structures, lists are homogeneous sequences. Tuples have structure, lists have order.

元組通常由不同的數據,而列表是相同類型的數據隊列。元組表示的是結構,而列表表示的是順序。舉個例子來講:當你想記錄棋盤上一個子的坐標時, 應該使用元組; 當你想記錄棋盤上所有的子的坐標(一系列相同的數據)時,應該使用列表。

# 表示一個點
point = (1, 2)

# 表示一系列點
points = [(1, 2), (1, 3), (4, 5)]

3. You can"t use list as a dictionary identifier.

你不能將列表當作字典的key, 而元組可以。

a= (1, 2)
b = [4, 5]

c = {a: "start point"} # OK
c = {b: "end point"} # Error

4. Due to the smaller size of a tuple operation with it a bit faster but not that much to mention about until you have a huge amount of elements.

由於元組支持的操作比列表小, 所以元組會比列表稍稍快上那麼一丟丟。但是除非你有巨量的數據要去處理,否者這一點不需要特彆強調。


就是因為不能修改才有用啊,因為不能修改,所以可以安全地保存一個引用,而不用擔心裏面的內容被其他程序修改了導致邏輯錯誤。

其實與大部分人想像的不同,Python中大部分對象從邏輯上來說都是不可變的,因為默認使用id作為hash值,這表明在對象整個生命周期中hash保持不變,==操作也返回相同的結果,因此哪怕屬性改變了,從Python的角度來看這個對象也是不變的。

對內置對象來說,int、float、str也是這樣的,但與對象有些不同的是,它們的hash值是直接跟值相關的,因此我們會發現1, 1L(Python2.x), 1.0的hash值是一樣的,它們的值也一樣,這樣對於set、dict等操作它們也會被當作是同一個key;但是它們的id()其實是不一樣的:

&>&>&> 1 == 1.0
True
&>&>&> hash(1)
1
&>&>&> hash(1.0)
1
&>&>&> id(1)
42360840L
&>&>&> id(1.0)
42421624L
&>&>&> hash(1.0 + 1e-10)
1304358912

Python中的對象在做字典的Key的時候,是否相等可以按照真實的值比較,而不是僅僅靠引用比較,這是很有用的特性。那麼有的時候我們有多個key,我們希望按對應位置的值是否一一對應地相等來判斷兩組key是否相等,這時候就需要tuple了,它實際上實現了一個遞歸進行hash的演算法:

&>&>&> (1,"abc") == (1.0,"abc")
True
&>&>&> hash((1,"abc"))
-1981908765
&>&>&> hash((1.0,"abc"))
-1981908765
&>&>&> ((1,1.0,1L,(1,),(1.0,1)),1.0) == ((1.0,1,1,(1.0,),(1,1.0)),1)
True
&>&>&> hash(((1,1.0,1L,(1,),(1.0,1)),1.0))
530469371
&>&>&> hash(((1.0,1,1,(1.0,),(1,1.0)),1))
530469371

可以對兩組帶有結構的數據進行比較和hash,這個是非常有用的。我們可以將許多數據結構用tuple來表示,比如說我們可以用tuple來表示一棵完整的二叉樹:

A
/
B C
/
D E F

("A",
("B",
("D",
(),
()
),
("E",
(),
()
)
),
("C",
(),
("F",
(),
()
)
)
)

那麼我們就可以計算這棵二叉樹的hash值,比較任意兩棵二叉樹,還可以將二叉樹作為dict的key,這當然會很有用。

tuple不可變,因此當我們保存了一個不可變對象的引用,我們不用擔心它被其他程序修改,任何時候它的hash值和等價關係都會保持不變,因此它可以作為dict的key或者在set中使用。list則是一個可變的對象,它可以在內存原位上增加或者刪除數據,但作為交換,它沒有固定的hash值,使用hash計算一個list對象的hash值會報錯,因此它也不可以作為dict的key來使用。

許多時候這兩個類型可以相互替代,但一般來說當我們需要高效率修改的時候考慮用list,而需要高效率比較時需要用tuple(因為可以引入set)。至於應該是同一類型,這倒未必,許多例子當中甚至可以用list來替代簡單的object,比如用list實現一個鏈表


如果沒學過什麼靜態類型語言的話就會有這個疑問,對於Array來說你沒法聲明或者確定某一索引處的類型,但是Tuple可以。所以在靜態類型語言中Tuple還是用得很多的。

所以這個問題的答案是:Tuple比Array更加安全(不僅是類型上的)。


1.列表

Python 有一些複合數據類型, 用來把其它值分組. 最全能的就是list,

它可以寫為在方括弧中的通過逗號分隔的一列值(項). 列表的項並不需要

是同一類型.

1 &>&>&> a = ["spam ", "eggs", 100 , 1234]

2 &>&>&> a

3 ["spam", "eggs ", 100 , 1234]

2.元組

Python的元組與列表類似,不同之處在於元組的元素不能修改

元組一般使用小括弧,列表使用方括弧。

元組創建很簡單,只需要在括弧中添加元素,並使用逗號隔開即可。

如下實例:

tup1 = ("physics", "chemistry", 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"

顯然,列表的許可權遠大於元組


我的回答與Leonard Peng的相似

1、不可變和可變

元組是不可變對象,對象一旦生成,它的值將不能更改;列表是可變對象,對象生成後,可以對其元素進行更改、添加、刪除、清空、排序等操作。

2、可哈希和不可哈希

可哈希對象就是能映射成內存地址的對象。在Python基本數據類型中,只有列表、字典和可變集合是不可哈希的。說元組是可哈希也不對,如果元組中某個元素是列表、字典或可變集合,那麼這個元組也是不可哈希的。可哈希對象和不可哈希對象的區別體現在:可哈希對象可以作為字典的鍵和集合的元素,不可哈希對象則不可以。


我只是過來看看哪個是元組哪個是列表的-_-



推薦閱讀:

Python 中列表推導(list comprehension)相對於循環有什麼優勢?性能會更高嗎?
如何在visual studio上寫 python?
如何在用 Python 編程時添加中文注釋?
零基礎小白學編程多久能達到接私活的水平?
python pandas 怎樣高效地添加一行數據?

TAG:Python |