2015-05-28 12 views
5

Ich sehe bestehende Fragen, die sich auf bestimmte Programmiersprachen beziehen. Es gibt Implementierungsunterschiede in bestimmten Sprachen, aber gibt es einen theoretischen konzeptionellen Unterschied?Gibt es einen Unterschied zwischen einer Liste und einem Tupel?

Änderbar vs unveränderlich: In Python sind Listen vollständig änderbar, während Tupel unveränderlich oder persistent unveränderlich sind, so dass Änderungen neue Tupel erstellen und Änderungen an Ort und Stelle nicht tun. Aber das ist nur ein Implementierungsdetail. In anderen Sprachen sind Tupel veränderbar und Listen sind unveränderlich.

Heterogene vs homogenen: Semantisch ist Tupel in der Regel heterogen, während Listen in der Regel homogen sind, aber das ist eher eine Konvention und es gibt viele Ausnahmen. Dynamisch typisierte Sprachen wie Python haben heterogene Listen. Haskell zum Beispiel hat Unterstützung für vollständig statisch typisierte heterogene Listen namens HList.

Finite vs Infinite: Theoretisch kann eine Liste unendlich sein, und einige Programmiersprachen (Haskell) unterstützen unendliche Listen. Ein Tupel darf nicht unendlich sein.

UPDATE: Der einzige theoretische Unterschied ist, dass ein Tupel endlich sein muss, während eine Liste theoretisch unendlich sein kann. Der Rest der Unterschiede sind reine Implementierungsunterschiede.

Wikipedia sagt "Ein Tupel ist eine endliche geordnete Liste von Elementen.".

Dies macht deutlich, dass ein Tupel eine Liste ist, aber eine endliche Liste.

+0

In welcher Sprache (n) ist die Wandlungsfähigkeit umgekehrt? –

+0

C++ - Listen und Tupel sind beide änderbar. – StilesCrisis

+0

Sie können diese Frage zu http://cs.stackexchange.com/ – StilesCrisis

Antwort

2

Aus einer C# -Perspektive würde der grellste Unterschied darin bestehen, dass Tupel über die Dauer ihrer Existenz eine feste Länge haben, während Listen die Funktionen zum Hinzufügen und Entfernen unterstützen, die ihre Längen ändern können.

Sie könnten argumentieren, dass dies nur eine willkürliche Implementierung Entscheidung ist, aber das führt zurück auf das Problem der Wandlungsfähigkeit. Angenommen, ich habe eine Tuple<double, double>, um einen 2D-Punkt darzustellen. Wenn ich eines der Elemente entferne, so dass ich Tuple<double> habe, ist es klar, dass dies kein 2D-Punkt mehr ist und die ursprüngliche Bedeutung selbst der verbleibenden Dimension wahrscheinlich nicht länger relevant oder verwendbar ist.

Wenn ich jedoch eine List<double> hatte, die die Punktzahl von 2 Schülern darstellt, und eine entferne, habe ich jetzt eine Liste von 1 Schülerwertung. Aber das eine verbleibende Double ist immer noch eine Punktzahl und behält dennoch die volle Bedeutung/Relevanz einer Punktzahl bei.

Kurz gesagt, ich sehe Tuple-Elemente als Attribute oder Dimensionen (in der Regel die minimal erforderliche Definitionsmenge), während ich Listenelemente als beliebige Instanzen sehe.

+0

verschieben C++ ist in dieser Hinsicht sehr ähnlich. Sie können Tupel mit 'tuple_cat' verketten, aber das ist nur ein neues Tupel mit einem neuen Typ. – StilesCrisis

+0

Der erste Unterschied ist einfache Unveränderlichkeit. In C#, wie Python oder Scala, sind Tupel standardmäßig unveränderlich. Sie können Elemente hinzufügen/entfernen, aber ein neues Tupel erstellen und das Original unverändert beibehalten. Die zweite Unterscheidung ist rein semantisch. Wenn Sie eine Liste mit Testergebnissen hätten, würden semantisch die meisten eine Liste verwenden, aber Sie könnten ein Tupel verwenden. – clay

1

Mathematisch könnte ein Tupel eine Liste von Elementen und daher auch eine Liste sein, aber ich weiß nichts über die Besonderheiten von Tupel und Liste in dieser Domäne. Aus Sicht der Programmierung sehe ich einen semantischen Unterschied, nämlich dass die Liste ein Container für Elemente ist und das Tupel ein Objekt ist, das mehrdimensionale Daten repräsentiert (zum Beispiel 2D- oder 3D-Punkte). Sie würden also kein Tupel verwenden, um eine Liste von Elementen zu speichern. Stattdessen verwenden Sie ein Tupel, um mehrdimensionale Daten darzustellen.

+0

Ein 2D/3D-Punkt ist eine Liste von Koordinaten. Ein Tupel ist immer eine Liste von Elementen. – clay