首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表用于同构数据,元组用于异构数据.为什么?

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

Stack Overflow用户
提问于 2014-07-20 19:32:55
回答 4查看 10.2K关注 0票数 11

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-20 19:58:37

这两者之间的区别比任何东西都更具有哲学意义。

元组是指固定的和预定的数据意义的缩写。例如:

代码语言:javascript
复制
person = ("John", "Doe")

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

  1. 当你发现一个价值缺失时,你不会感到惊讶。人总是有两个价值。一直都是。
  2. 你从不会惊讶地发现一些额外的东西。与字典不同,另一段代码不能“添加新键”或属性

这种可预见性叫做不变性 --它只是一种奇特的方式,可以说它有一个固定的结构。

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

代码语言:javascript
复制
some_dict = {person: "blah blah"}

很管用。但是:

代码语言:javascript
复制
da_list = ["Larry", "Smith"]
some_dict = {da_list: "blah blah"}

不管用。

不要让元素引用是相似的(person vs da_list)这一事实使您无法理解。人是名字。da_list只是目前列表中的第一项。

票数 8
EN

Stack Overflow用户

发布于 2014-07-20 19:36:52

首先,这条准则是完全正确的。您可以对同质数据使用元组,对于异构数据可以使用列表,在某些情况下,这是一件很好的事情。一种重要的情况是,如果您需要将集合转换为hashable,那么您可以使用它作为字典键;在这种情况下,您必须使用元组,即使所有元素在本质上都是同质的。

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

尽管如此,我认为列表对于同质数据来说是首选的原因之一是因为它们是可变的。如果你有一个相同种类的列表,那么在这个列表中添加一个,或者拿走一个,也许是有意义的;当你这样做的时候,你仍然会有一个同类的列表。

相反,如果您有一组不同种类的事物,通常是因为您对它们有固定的结构或“模式”(例如,第一个是ID号,第二个是名称,第三个是地址,或者其他什么)。在这种情况下,从集合中添加或删除元素是没有意义的,因为集合是一个集成的整体,每个元素都有指定的角色。如果不更改元素所代表的内容的整个架构,就无法添加元素。

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

票数 17
EN

Stack Overflow用户

发布于 2014-07-20 19:38:47

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24854139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档