列表用于同构数据,元组用于异构数据。。。为什么?

2024-04-28 02:03:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我觉得这肯定是以前问过的(可能不止一次),所以可能会提前道歉,但我在任何地方(这里或通过谷歌)都找不到。

无论如何,在解释Python中列表和元组之间的区别时,在元组是不可变的之后,第二件事提到的是列表最适合同构数据,元组最适合异构数据。但似乎没人想解释为什么会这样。为什么会这样?


Tags: 数据列表地方异构元组区别同构
3条回答

这不是规则,只是传统。

在许多语言中,列表必须是同质的,元组必须是固定长度的。C++、C语言、Haskell、Ru锈等都是如此。元组被用作匿名结构。在数学上也是这样。

但是,Python的类型系统不允许您进行这些区分:可以创建动态长度的元组,也可以使用异构数据创建列表。所以你可以对Python中的列表和元组做任何你想做的事情,这可能会让其他阅读你的代码的人感到惊讶。如果阅读代码的人有数学背景或者更熟悉其他语言,这一点尤其正确。

这种差异是哲学上的。

元组是fixed和预定数据含义的简写。例如:

person = ("John", "Doe")

所以,这个例子是一个人,他有名字和姓氏。这是一个关键因素。不是数据类型。“约翰”和“多伊”都是字符串,但这不是重点。这样做的好处是不可改变的:

  1. 当你发现一个值丢失时,你不会感到惊讶。人总是有两种价值观。总是。

  2. 你不会惊讶于发现有什么新的东西。与字典不同,另一位代码不能“添加新键”或属性

这种可预测性称为immutability 这只是说它有固定的结构的一种奇特的说法。

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

some_dict = {person: "blah blah"}

有效。但是:

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

不起作用。

不要因为元素引用是相似的(person[0]vs da_list[0])而放弃。人名[0]是名字。dau list[0]只是当前列表中的第一项。

首先,这条准则是唯一正确的。您可以自由使用元组来处理同质数据,也可以使用列表来处理异质数据,在某些情况下,这是一件很好的事情。一个重要的情况是,如果需要哈希表的集合,以便可以将其用作字典键;在这种情况下,必须使用元组,即使所有元素本质上都是同质的。

还要注意,同质/异质的区别实际上是关于数据的语义,而不仅仅是类型。一个名称、职业和地址的序列可能被认为是异构的,即使这三个序列都可以表示为字符串。因此,更重要的是要考虑如何处理数据(即,您是否会对元素进行相同的处理),而不是考虑它们是什么类型的。

也就是说,我认为对于同质数据,列表是首选的一个原因是它们是可变的。如果你有一个同一类的清单,那么在清单上再加一个,或者拿走一个,也许是有意义的;当你这样做的时候,你仍然会留下一个同一类的清单。

相比之下,如果你有一个异类的集合,那通常是因为你有一个固定的结构或“模式”(例如,第一个是ID号,第二个是名字,第三个是地址,或者其他什么)。在这种情况下,从集合中添加或删除元素是没有意义的,因为集合是一个集成的整体,每个元素都具有指定的角色。如果不更改元素所表示的整个架构,则无法添加元素。

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

相关问题 更多 >