列表用于同类数据,元组用于异类数据...为什么?

11 投票
4 回答
11225 浏览
提问于 2025-04-18 14:02

我觉得这个问题可能之前有人问过(可能不止一次),所以提前道个歉,不过我在这里或者通过谷歌都找不到相关的信息。

总之,在解释Python中列表和元组的区别时,第二个提到的点是元组是不可变的,而列表更适合同类数据,元组则更适合异类数据。但似乎没有人解释一下为什么会这样。那么,为什么会这样呢?

4 个回答

0

列表通常用来遍历,也就是对列表中的每个元素执行相同的操作。很多列表操作都是基于这个原理。因此,最好确保列表中的每个元素都是相同类型的,这样就不会因为某个元素类型不对而出现错误。

元组则是一种更有结构的数据;它们是不可变的,所以如果你正确使用它们,就不会遇到类型错误。如果你想要组合多种类型的数据(就像临时创建一个struct),那么元组就是你应该使用的数据结构。

4

这不是一个规则,而是一种传统。

在很多编程语言中,列表必须是同类的,也就是说里面的元素类型要一样;而元组则必须是固定长度的。这在C++、C#、Haskell、Rust等语言中都是这样的。元组通常用作匿名结构,数学上也是如此。

不过,Python的类型系统不这样限制:你可以创建长度不固定的元组,也可以创建包含不同类型数据的列表。所以在Python中,你可以随意使用列表和元组,但这可能会让其他阅读你代码的人感到意外,尤其是那些有数学背景或者更熟悉其他编程语言的人。

17

首先,这个指导原则其实并不是绝对的。你可以用元组来存放相同类型的数据,用列表来存放不同类型的数据,有时候这样做也是可以的。一个重要的情况是,如果你需要把这个集合用作字典的键,那么你必须使用元组,即使里面的元素都是同一种类型。

另外,关于同质和异质的区分,其实是看数据的意义,而不仅仅是数据的类型。比如,一个名字、职业和地址的组合,虽然这三者都可以用字符串表示,但它们的意义是不同的,所以可以认为这是异质的。因此,考虑你打算如何使用这些数据(也就是说,你是否会把这些元素当作相同的来处理)比关注它们的类型更重要。

说到这里,我觉得列表之所以更适合存放同质数据,是因为列表是可变的。如果你有一个包含多个相同类型事物的列表,可能会需要往里面添加一个新的,或者删除一个;这样做之后,你仍然会得到一个相同类型的列表。

相对而言,如果你有一个包含不同类型事物的集合,通常是因为这些事物有一个固定的结构或“模式”(比如,第一个是ID号码,第二个是名字,第三个是地址,等等)。在这种情况下,添加或删除集合中的元素就不太合适,因为这个集合是一个整体,每个元素都有特定的角色。你不能随便添加一个元素,否则就会改变整个集合的结构。

简而言之,对于同质集合来说,大小的变化更自然,因此可变类型更适合同质集合。

8

这两者的区别更多是哲学上的,而不是技术上的。

元组(tuple)是用来表示固定和预先定义好的数据含义的简写方式。举个例子:

person = ("John", "Doe")

这个例子表示一个人,他有名字和姓氏。这里的固定特性是最重要的,而不是数据类型。“John”和“Doe”都是字符串,但这不是重点。它的好处在于这种不可改变的特性:

  1. 你永远不会惊讶于发现某个值缺失。一个人总是有两个值。永远都是。

  2. 你也不会惊讶于发现有什么东西被添加了。与字典不同,其他代码不能“添加一个新键”或属性。

这种可预测性被称为不可变性,简单来说就是它有一个固定的结构。

其中一个直接的好处是它可以用作字典的键。所以:

some_dict = {person: "blah blah"}

是可以的。但:

da_list = ["Larry", "Smith"]
some_dict = {da_list: "blah blah"}

则不可以。

不要被元素引用的相似性搞混(比如person[0]和da_list[0])。person[0]是名字,而da_list[0]只是此时此刻列表中的第一个项目。

撰写回答