2015-05-28 33 views
5

我看到了與特定編程語言相關的現有問題。在特定語言中存在實現差異,但是理論上存在概念上的差異嗎?列表和元組有區別嗎?

可變與不可變:在Python中,列表是完全可變的,而元組是不可變的或持久不變的,所以修改會創建新的元組並且不會在原地進行修改。但這純粹是一個實現細節。在其他語言中,元組是可變的,列表是不可變的。

異構vs齊性:語義上,元組通常是異構的,而列表通常是同構的,但這更多的是一種約定,並且有許多例外。像Python這樣的動態類型語言具有異構列表。例如,Haskell支持完全靜態類型的稱爲HList的異構列表。

有限與無限:理論上,列表可以是無限的,並且一些編程語言(Haskell)支持無限列表。元組不能是無限的。

UPDATE:唯一的理論區別是一個元組必須是有限的,而列表在理論上可以是無限的。其餘的差異是純粹的實施差異。

維基百科說:「元組是一個有限有序的元素列表。」

這表明一個元組是一個列表,但是是一個有限列表。

+0

在哪種語言是可變性的另一種方式? –

+0

C++列表和元組都是可變的。 – StilesCrisis

+0

您可能想將此問題移至http://cs.stackexchange.com/ – StilesCrisis

回答

2

從C#的角度來看,最顯着的區別是元組的長度在其存在期間是固定長度的,而列表支持添加和刪除功能,這些功能可能會導致其長度發生變化。

你可能會認爲這只是一個隨意的實現決定,但是這會導致可變性問題。假設我有一個Tuple<double, double>來表示一個2D點。如果我刪除了其中一個元素,所以我有Tuple<double>,很明顯,這不再是2D點,甚至剩餘維度的原始含義可能不再相關或可用。

但是,如果我有List<double>代表2個學生的分數,並刪除一個,我現在有一個學生的分數列表。但剩下的兩位仍然是一個分數,仍然保留了分數的全部含義/相關性。

簡而言之,我將Tuple元素看作屬性或維度(通常是最低限度需要的定義集合),而我將List元素視爲任意實例。

+0

C++在這方面非常相似。你可以用tuple_cat連接元組,但這實際上只是創建一個新類型的新元組。 – StilesCrisis

+0

第一個區別是簡單的不變性。在C#中,像Python或Scala一樣,元組默認是不可變的。您可以添加/刪除元素,但會創建一個新元組並保持原始不變。第二個區別純粹是語義。如果你有一個測試成績列表,大部分語義上都會使用一個列表,但你可以使用一個元組 – clay

1

在數學上,元組可能是元素的列表,因此也是一個列表,但我不知道該元組和列表在該域中的具體情況。從編程的角度來看,我看到了語義上的區別,即列表是元素的容器,元組是表示多維數據的對象(例如2D或3D點)。所以你不會使用元組來保存元素列表。相反,您使用元組來表示多維數據。

+0

2D/3D點是一個座標列表。元組總是一個元素列表。 – clay