python:list和tuple,什么时候使用它们?

 2019-04-22 

python: list vs tuple, when to use each?

本问题已经有最佳答案,请猛点这里访问。

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

有时你没有选择,例如如果你有

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

那么x必须是一个元组。

但是如果我是设计API并选择数据类型的人,那么指导原则是什么?


元组本质上是固定大小的,而列表是动态的。换句话说,tuple是不变的,而list是可变的。

  • 不能向元组添加元素。元组没有append或extend方法。
  • 不能从元组中移除元素。元组没有remove或pop方法。
  • 您可以在元组中找到元素,因为这不会改变元组。
  • 还可以使用in运算符检查tuple中是否存在元素。
    • 元组比列表快。如果您要定义一组常量值,而您所要做的就是遍历它,那么使用一个元组而不是一个列表。

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

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

    来源:进入python 3


    对于异类集合,有一种很强的元组文化,类似于在C中使用struct,列表用于同种集合,类似于数组。但我从来没有把这和其他答案中提到的易变性问题做过比较。易变性有它的牙齿(实际上你不能改变一个元组),而同质性是不强制的,因此似乎是一个不那么有趣的区别。


    我相信(而且我很难精通python),主要的区别是元组是不可变的(在赋值后不能在适当的位置进行更改),列表是可变的(可以追加、更改、减去等)。

    所以,我倾向于做我的tuples,作业后不应该改变的东西,列出可以改变的东西。


    它必须是可变的吗?使用列表。一定不能是可变的吗?使用元组。

    否则,这是一个选择的问题。

    对于异类对象的集合(如分为名称、街道、城市、州和zip的地址),我更喜欢使用元组。它们总是可以很容易地升级为命名的元组。

    同样,如果要迭代集合,我更喜欢列表。如果它只是一个容器,可以将多个对象作为一个容器来保存,那么我更喜欢使用元组。


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

    在我的经验中,元组通常用于顺序和位置有意义且一致的地方。例如,在为ChooseYourAdventure游戏创建数据结构时,我选择使用元组而不是列表,因为元组中的位置很有意义。下面是该数据结构的一个示例:

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

    元组中的第一个位置是用户玩游戏时显示给他们的选择,第二个位置是选择要转到的页面的键,这对于所有页面都是一致的。

    元组的内存效率也比列表高,不过我不确定什么时候这种优势变得明显。

    还可以查看think python中关于列表和元组的章节。


    But if I am the one who designs the API and gets to choose the data types, then what are the guidelines?

    对于输入参数,最好接受执行所需操作的最通用的接口。它很少只是一个元组或列表——更常见的是它是序列、可切片甚至是不可分割的。python的duck类型通常是免费的,除非您显式地检查输入类型。除非绝对不可避免,否则不要这样做。

    对于您生成的数据(输出参数),只返回最方便的数据,例如返回您保留的任何数据类型或帮助函数返回的任何数据类型。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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没有元组类型。Yaml可以,但是它的语法与它的列表语法相比很难看,这非常好。

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