python:列表与元组,何时使用每个?

在Python中,什么时候应该使用列表和元组?

有时你没有select,例如,如果你有

"hello %s you are %s years old" % x 

那么x必须是一个元组。

但是如果我是deviseAPI并select数据types的人,那么准则是什么?

对于异构集合有一个强大的元组文化,类似于你在C中使用struct ,而列表是用于同类集合的,与你使用数组的类似。 但是我从来没有用其他答案中提到的可变性问题来解决这个问题。 可变性有它的牙齿(你实际上不能改变一个元组),而同质性没有被执行,所以似乎是一个不太有趣的区别。

元组固定大小,而列表是dynamic的。
换句话说, tuple不可变的,list可变的

  1. 您不能将元素添加到元组中。 元组没有追加或扩展方法。
  2. 你不能从元组中删除元素。 元组没有删除或popup方法。
  3. 你可以在元组中find元素,因为这不会改变元组。
  4. 您也可以使用in运算符来检查元组中是否存在元素。

  • 元组比列表更快。 如果你正在定义一组常量值,并且你将要使用它来遍历它,那么使用一个元组而不是一个列表。

  • 如果您“写保护”不需要更改的数据,它会使您的代码更安全。 使用一个元组而不是一个列表就像有一个隐含的assert语句,这个数据是不变的,需要特殊的思想(和一个特定的函数)来覆盖它。

  • 有些元组可以用作字典键(特别是包含string,数字和其他元组等不可变值的元组)。 列表永远不能用作字典键,因为列表不是不可变的。

来源: 潜入Python 3

我相信(而且我对Python并不熟悉),主要区别在于一个元组是不可变的 (在赋值之后它不能被改变)和一个列表是可变的 (你可以追加,改变,减去等等)。

所以,我倾向于让我的元组在分配之后不应该改变的东西,并且列出可以的东西。

它必须是可变的吗? 使用一个列表。 难道它不可变吗? 使用一个元组。

否则,这是一个select的问题。

对于异类对象的集合(比如地址分成姓名,街道,城市,州和邮编),我更喜欢使用一个元组。 他们总是可以很容易地晋升为命名元组 。

同样,如果集合将被迭代,我更喜欢列表。 如果它只是容纳多个对象的容器,我更喜欢一个元组。

您需要决定的第一件事是数据结构是否需要可变。 如前所述,列表是可变的,元组不是。 这也意味着元组可以用于字典键,而列表不能。

根据我的经验,元组通常用于顺序和位置有意义和一致的地方。 例如,在为一个自己的冒险游戏创build数据结构时,我select使用元组而不是列表,因为元组中的位置是有意义的。 下面是这个数据结构的一个例子:

 pages = {'foyer': {'text' : "some text", 'choices' : [('open the door', 'rainbow'), ('go left into the kitchen', 'bottomless pit'), ('stay put','foyer2')]},} 

元组中的第一个位置是用户在玩游戏时显示给用户的select,第二个位置是所选页面的键,这对所有页面都是一致的。

元组也比列表更有记忆效率,尽pipe我不确定何时该好处变得明显。

还请看看Think Python中列表和元组的章节。

但是如果我是deviseAPI并select数据types的人,那么准则是什么?

对于input参数,最好接受你所需要的最通用的接口。 它很less只是一个元组或列表 – 更多的时候是序列,切片或者可迭代的。 Python的鸭子打字通常是免费的,除非你明确地检查inputtypes。 除非绝对不可避免,否则不要这样做。

对于你产生的数据(输出参数)只是返回你最方便的数据,例如返回你保存的数据types或者你的帮助函数返回的内容。

要记住的一件事是避免返回一个列表(或任何其他可变),这是你的状态的一部分,例如

 class ThingsKeeper def __init__(self): self.__things = [] def things(self): return self.__things #outside objects can now modify your state def safer(self): return self.__things[:] #it's copy-on-write, shouldn't hurt performance 

一个元组上列表的一个小但显着的优点是列表往往是稍微便携的。 标准工具不太可能支持元组。 例如,JSON没有元组types。 YAML可以,但是它的语法与其列表语法相比是丑陋的,这相当不错。

在这些情况下,您可能希望在内部使用元组,然后将其转换为列表作为导出过程的一部分。 或者,您可能想要在任何地方使用列表来保持一致性。