列表和元组之间有区别吗?

时间:2015-05-28 22:18:56

标签: list tuples theory

我看到与特定编程语言相关的现有问题。特定语言存在实现差异,但是存在理论上的概念差异吗?

Mutable vs immutable :在Python中,列表是完全可变的,而元组是不可变的或持久不可变的,因此修改创建新的元组并且不进行就地修改。但这纯粹是一个实现细节。在其他语言中,元组是可变的,列表是不可变的。

异构与同类:从语义上讲,元组通常是异构的,而列表通常是同构的,但这更像是一种约定,并且有很多例外。像Python这样的动态类型语言具有异构列表。例如,Haskell支持称为HList的完全静态类型的异构列表。

有限与无限:理论上,列表可以是无限的,一些编程语言(Haskell)支持无限列表。元组不可能是无限的。

UPDATE :唯一的理论差异是元组必须是有限的,而列表理论上可以是无限的。其余的差异是纯粹的实现差异。

维基百科说“元组是一个有限的有序元素列表。”。

这清楚地表明元组是一个列表,而是一个有限列表。

4 个答案:

答案 0 :(得分:2)

从C#的角度来看,最显着的差异是元组在其存在的持续时间内是固定长度,而列表支持添加和删除可能导致其长度发生变化的功能。

你可能会认为这只是一个随意的实施决定,但这会导致可变性问题。假设我有Tuple<double, double>来表示2D点。如果我删除了其中一个元素,那么我有Tuple<double>,很明显这不再是2D点,甚至剩余维度的原始含义可能不再相关或可用。

但是,如果我有List<double>代表2个学生的分数,并删除一个,我现在有一个学生分数的列表。但剩下的两个仍然是一个分数,仍然保留了分数的全部含义/相关性。

简而言之,我将元组元素视为属性或维度(通常是最低要求的定义集),而我将List元素视为任意实例。

答案 1 :(得分:1)

在数学上,元组可能是一个元素列表,因此也是一个列表,但我不知道该域中元组和列表的细节。从编程的角度来看,我看到了一个语义差异,即列表是元素的容器,而元组是表示多维数据的对象(例如2D或3D点)。所以你不会使用元组来保存元素列表。相反,您使用元组来表示多维数据。

答案 2 :(得分:1)

元组是列表的子类型,具有每个元素的附加类型约束,并且定义的大小作为其类型的一部分。如果列表具有大小限制并指定了所有元素的类型(例如Haskell的HList),那么从概念上讲它也是一个元组。

并非所有列表都是元组,但是所有元组都是列表。

元组和列表之间的关系是负数和数字之间的关系。并非所有的数字都是负数,但是所有的负数都是数字。

答案 3 :(得分:0)

元组只是一个有限列表。所有元组都是列表。所有有限列表都是元组。无限列表不是元组。输入和语义的所有差异纯粹是依赖于语言的考虑。