2015-05-28 12 views
5

Widzę istniejące pytania dotyczące określonych języków programowania. Istnieją różnice w implementacji w określonych językach, ale czy istnieje teoretyczna różnica koncepcyjna?Czy istnieje różnica między listą a krotką?

Zmienna vs niezmiennej: W Pythonie listy są całkowicie zmienny podczas krotki są niezmienne lub uporczywie niezmienne tak, że modyfikacje tworzyć nowe krotki i nie rób w miejsce modyfikacji. Jest to jednak wyłącznie szczegół implementacji. W innych językach krotki są zmienne, a listy są niezmienne.

Heterogeniczna vs jednorodna: Semantycznie, krotki są zwykle heterogeniczne, natomiast listy są zazwyczaj jednorodne, ale jest to bardziej konwencja i jest wiele wyjątków. Dynamicznie pisane języki, takie jak Python, mają niejednorodne listy. Na przykład Haskell obsługuje całkowicie statycznie typowane niejednorodne listy o nazwie HList.

Finite vs Infinite: Teoretycznie lista może być nieskończona, a niektóre języki programowania (Haskell) obsługują nieskończone listy. Krotka nie może być nieskończona.

UPDATE: Jedyną teoretyczną różnicą jest to, że krotka musi być skończona, podczas gdy lista może teoretycznie być nieskończona. Pozostałe różnice są czystymi różnicami w implementacji.

Wikipedia mówi: "Krotka to skończona uporządkowana lista elementów.".

To wyjaśnia, że ​​krotka jest listą, ale skończoną listą.

+0

W jakim języku (językach) występuje zmienność? –

+0

Listy i krotki w C++ są zmienne. – StilesCrisis

+0

Możesz przenieść to pytanie na http://cs.stackexchange.com/ – StilesCrisis

Odpowiedz

2

Z perspektywy C# najbardziej jaskrawą różnicą byłoby to, że krotki mają stałą długość przez cały okres ich istnienia, podczas gdy listy obsługują funkcję dodawania i usuwania, która może powodować zmianę długości.

Można argumentować, że jest to arbitralna decyzja o wdrożeniu, ale to prowadzi do problemu zmienności. Powiedzmy, że mam Tuple<double, double> reprezentujący punkt 2D. Jeśli usuniemy jeden z elementów, więc mam Tuple<double>, jasne jest, że nie jest to już punkt 2D, a pierwotne znaczenie nawet pozostałego wymiaru prawdopodobnie nie jest już istotne ani użyteczne.

Jeśli jednak miałem List<double> reprezentujący wyniki 2 uczniów i usunąłem, teraz mam listę wyników 1 ucznia. Ale jeden pozostały podwójny jest nadal wynikiem i nadal zachowuje pełne znaczenie/trafność wyniku.

W skrócie, widzę elementy Tuple jako atrybuty lub wymiary (zwykle minimalnie wymagany zestaw definiujący), podczas gdy ja widzę elementy listy jako arbitralne.

+0

C++ jest bardzo podobne pod tym względem. Możesz łączyć krotki z 'tuple_cat', ale to jest po prostu tworzenie nowej krotki z nowym typem. – StilesCrisis

+0

Pierwsza różnica polega na prostej niezmienności. W języku C#, podobnie jak Python lub Scala, krotki są domyślnie niezmienne. Możesz dodawać/usuwać elementy, ale to tworzy nową krotkę i zachowuje oryginalny niezmieniony. Drugie rozróżnienie jest czysto semantyczne. Jeśli masz listę wyników testów, semantycznie większość użyłaby listy, ale możesz użyć krotki – clay

1

Matematyczne, krotka może być lista elementów, a więc również lista, ale nie wiem o szczegółach krotki i listy w tej domenie. Z punktu widzenia programowania widzę różnicę semantyczną polegającą na tym, że lista jest kontenerem dla elementów, a krotka jest obiektem reprezentującym wielowymiarowe dane (na przykład punkty 2D lub 3D). Więc nie używałbyś krotki do zapisania listy elementów. Zamiast tego używasz krotki do reprezentowania wielowymiarowych danych.

+0

Punkt 2D/3D jest listą współrzędnych. Krotka jest zawsze listą elementów. – clay

Powiązane problemy