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

Is there a difference between a list and a tuple?

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

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

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

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

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

维基百科说 "A tuple is a finite ordered list of elements."。

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

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

你可能会争辩说这只是一个任意的实施决定,但这又回到了可变性问题。假设我有一个 Tuple<double, double> 来表示一个二维点。如果我删除其中一个元素所以我有 Tuple<double>,很明显这不再是 2D 点,甚至剩余维度的原始含义可能不再相关或可用。

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

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

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

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

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

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

元组只是一个有限列表。所有元组都是列表。所有有限列表都是元组。无限列表不是元组。打字和语义的所有差异纯粹是语言相关的考虑因素。