我看到与特定编程语言相关的现有问题。特定语言存在实现差异,但是存在理论上的概念差异吗?
Mutable vs immutable :在Python中,列表是完全可变的,而元组是不可变的或持久不可变的,因此修改创建新的元组并且不进行就地修改。但这纯粹是一个实现细节。在其他语言中,元组是可变的,列表是不可变的。
异构与同类:从语义上讲,元组通常是异构的,而列表通常是同构的,但这更像是一种约定,并且有很多例外。像Python这样的动态类型语言具有异构列表。例如,Haskell支持称为HList的完全静态类型的异构列表。
有限与无限:理论上,列表可以是无限的,一些编程语言(Haskell)支持无限列表。元组不可能是无限的。
UPDATE :唯一的理论差异是元组必须是有限的,而列表理论上可以是无限的。其余的差异是纯粹的实现差异。
维基百科说“元组是一个有限的有序元素列表。”。
这清楚地表明元组是一个列表,而是一个有限列表。
答案 0 :(得分:2)
从C#的角度来看,最显着的差异是元组在其存在的持续时间内是固定长度,而列表支持添加和删除可能导致其长度发生变化的功能。
你可能会认为这只是一个随意的实施决定,但这会导致可变性问题。假设我有Tuple<double, double>
来表示2D点。如果我删除了其中一个元素,那么我有Tuple<double>
,很明显这不再是2D点,甚至剩余维度的原始含义可能不再相关或可用。
但是,如果我有List<double>
代表2个学生的分数,并删除一个,我现在有一个学生分数的列表。但剩下的两个仍然是一个分数,仍然保留了分数的全部含义/相关性。
简而言之,我将元组元素视为属性或维度(通常是最低要求的定义集),而我将List元素视为任意实例。
答案 1 :(得分:1)
在数学上,元组可能是一个元素列表,因此也是一个列表,但我不知道该域中元组和列表的细节。从编程的角度来看,我看到了一个语义差异,即列表是元素的容器,而元组是表示多维数据的对象(例如2D或3D点)。所以你不会使用元组来保存元素列表。相反,您使用元组来表示多维数据。
答案 2 :(得分:1)
元组是列表的子类型,具有每个元素的附加类型约束,并且定义的大小作为其类型的一部分。如果列表具有大小限制并指定了所有元素的类型(例如Haskell的HList),那么从概念上讲它也是一个元组。
并非所有列表都是元组,但是所有元组都是列表。
元组和列表之间的关系是负数和数字之间的关系。并非所有的数字都是负数,但是所有的负数都是数字。
答案 3 :(得分:0)
元组只是一个有限列表。所有元组都是列表。所有有限列表都是元组。无限列表不是元组。输入和语义的所有差异纯粹是依赖于语言的考虑。