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

时间:2014-07-20 19:32:56

标签: python

我觉得以前一定要问过这个问题(可能不止一次),所以可能会提前道歉,但我无法在任何地方找到它(在这里或通过谷歌)。

无论如何,在解释Py​​thon中列表和元组之间的区别时,在元组不可变之后提到的第二件事是列表最适用于同类数据,而元组最适合异构数据。但似乎没有人想到解释为什么就是这种情况。那么为什么会这样呢?

4 个答案:

答案 0 :(得分:15)

首先,该准则只是真实的。您可以自由地使用元组作为同源数据和异构数据列表,并且可能存在这样做的好事。一个重要的情况是如果你需要集合到hashable,那么你可以将它用作字典键;在这种情况下,你必须使用一个元组,即使所有元素本质上都是同质的。

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

那就是说,我认为一个理由列表是同源数据的首选因为它们是可变的。如果你有一个同类的几个东西的列表,可能有意义的是在列表中添加另一个,或取一个;当你这样做时,你仍然留下了同类事物的清单。

相比之下,如果你收集了异类的东西,通常是因为你有一个固定的结构或者#34; schema"他们(例如,第一个是ID号,第二个是名称,第三个是地址,或其他)。在这种情况下,从集合中添加或删除元素没有意义,因为集合是具有每个元素的指定角色的集成整体。您无法在不更改元素所代表的整个架构的情况下添加元素。

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

答案 1 :(得分:6)

差异在于哲学而不是任何东西。

元组意味着固定和预定数据含义的简写。例如:

person = ("John", "Doe")

所以,这个例子是一个有名字和姓氏的人。 固定的性质是关键因素。不是数据类型。两个"约翰"和" Doe"是字符串,但这不是重点。这样做的好处是不可改变的性质:

  1. 发现缺少值时,您永远不会感到惊讶。人总是有两个价值观。总是

  2. 发现添加的东西,你永远不会感到惊讶。与字典不同,另一部分代码可以添加新密钥"或属性

  3. 这种可预测性称为immutability 这只是一种说它具有固定结构的奇特方式。

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

    some_dict = {person: "blah blah"}
    

    的工作原理。但是:

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

    不起作用。

    不要让元素引用相似(person [0] vs da_list [0])的事实让你失望。 person [0]是名字。 da_list [0]只是此时列表中的第一项。

答案 2 :(得分:3)

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

在许多语言中,列表必须是同质的,而元组必须是固定长度的。对于C ++,C#,Haskell,Rust等也是如此。元组用作匿名结构。这与数学是一样的。

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

答案 3 :(得分:0)

列表通常用于迭代它们,并对列表中的每个元素执行相同的操作。许多列表操作都基于此。出于这个原因,最好让每个元素都是相同的类型,以免你得到异常,因为一个项目是错误的类型。

元组是更结构化的数据;它们是不可变的,所以如果你正确处理它们就不会遇到类型错误。如果您特别想要组合多种类型(例如即时struct),那就是您使用的数据结构。