这个问题在这里已有答案:
在Python中,何时应该使用列表和何时使用元组?
有时你没有选择,例如你有
"hello %s you are %s years old" % x
然后x必须是一个元组 .
但如果我是设计API并选择数据类型的人,那么指导原则是什么?
它必须是可变的吗?使用列表 . 它一定不可变吗?使用元组 .
否则,这是一个选择问题 .
对于异构对象的集合(如地址分为名称,街道,城市,州和邮编),我更喜欢使用元组 . 他们总是可以轻松晋升为named tuples .
同样,如果要迭代集合,我更喜欢列表 . 如果它只是一个容纳多个对象的容器,我更喜欢一个元组 .
Tuples本质上是固定大小,而lists是动态的 .换句话说, tuple 是 immutable 而 list 是 mutable .
tuple
list
您无法将元素添加到元组 . 元组没有追加或扩展方法 .
您无法从元组中删除元素 . 元组没有删除或弹出方法 .
您可以在元组中找到元素,因为这不会更改元组 .
您还可以使用 in 运算符来检查元组中是否存在元素 .
in
Tuples are faster than lists. 如果您正在使用它,则迭代它,使用元组而不是列表 .
如果您“写保护”不需要更改的数据,它会使您的代码更安全 . 使用元组而不是列表就像有一个隐含的断言声明,这个数据是常量,并且需要特殊思想(和特定函数)来覆盖它 .
某些元组可以用作字典键(特别是包含不可变值的元组,如字符串,数字和其他元组) . 列表永远不能用作字典键,因为列表不是不可变的 .
资料来源:Dive into Python 3
我相信(我并不精通Python)主要区别在于元组是不可变的(在赋值后它不能就地改变)并且列表是可变的(你可以追加,改变,减去等等) ) .
所以,我倾向于让我的元组在分配后不应该改变的东西,我列出的东西可以 .
对于输入参数,最好接受最符合您需求的通用接口 . 它很少只是一个元组或列表 - 更常见的是序列,可切片甚至可迭代 . 除非你明确检查输入类型,否则Python的鸭子打字通常是免费的 . 除非绝对不可避免,否则不要这样做 .
对于您生成的数据(输出参数),只需返回对您最方便的数据,例如:返回您保留的任何数据类型或您的帮助函数返回的任何内容 .
要记住的一件事是避免返回属于您所在州的列表(或任何其他可变的列表),例如:
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确实如此,但与其列表语法相比,它的语法很难看,这非常好 .
在这些情况下,您可能希望在内部使用元组,然后转换为列表作为导出过程的一部分 . 或者,您可能希望在任何地方使用列表以保持一致性 .
您需要确定的第一件事是数据结构是否需要是可变的 . 如前所述,列表是可变的,元组不是 . 这也意味着元组可以用于字典键,而列表则不能 .
根据我的经验,元组通常用于秩序和位置有意义且一致的地方 . 例如,在为选择自己的冒险游戏创建数据结构时,我选择使用元组而不是列表,因为元组中的位置是有意义的 . 以下是该数据结构的一个示例:
pages = {'foyer': {'text' : "some text", 'choices' : [('open the door', 'rainbow'), ('go left into the kitchen', 'bottomless pit'), ('stay put','foyer2')]},}
元组中的第一个位置是用户在玩游戏时显示的选项,第二个位置是选择所在页面的键,这对所有页面都是一致的 .
元组也比列表更有内存效率,但我不确定这种好处何时变得明显 .
另请查看Think Python中列表和元组的章节 .
有's a strong culture of tuples being for heterogeneous collections, similar to what you' d在C中使用 struct ,并且列出了同类集合,类似于你从来没有用其他答案中提到的可变性问题来解决这个问题 . 可变性对它有影响(你实际上不能改变一个元组),而同质性没有强制执行,因此似乎是一个不那么有趣的区别 .
struct
7 回答
它必须是可变的吗?使用列表 . 它一定不可变吗?使用元组 .
否则,这是一个选择问题 .
对于异构对象的集合(如地址分为名称,街道,城市,州和邮编),我更喜欢使用元组 . 他们总是可以轻松晋升为named tuples .
同样,如果要迭代集合,我更喜欢列表 . 如果它只是一个容纳多个对象的容器,我更喜欢一个元组 .
Tuples本质上是固定大小,而lists是动态的 .
换句话说,
tuple
是 immutable 而list
是 mutable .您无法将元素添加到元组 . 元组没有追加或扩展方法 .
您无法从元组中删除元素 . 元组没有删除或弹出方法 .
您可以在元组中找到元素,因为这不会更改元组 .
您还可以使用
in
运算符来检查元组中是否存在元素 .Tuples are faster than lists. 如果您正在使用它,则迭代它,使用元组而不是列表 .
如果您“写保护”不需要更改的数据,它会使您的代码更安全 . 使用元组而不是列表就像有一个隐含的断言声明,这个数据是常量,并且需要特殊思想(和特定函数)来覆盖它 .
某些元组可以用作字典键(特别是包含不可变值的元组,如字符串,数字和其他元组) . 列表永远不能用作字典键,因为列表不是不可变的 .
资料来源:Dive into Python 3
我相信(我并不精通Python)主要区别在于元组是不可变的(在赋值后它不能就地改变)并且列表是可变的(你可以追加,改变,减去等等) ) .
所以,我倾向于让我的元组在分配后不应该改变的东西,我列出的东西可以 .
对于输入参数,最好接受最符合您需求的通用接口 . 它很少只是一个元组或列表 - 更常见的是序列,可切片甚至可迭代 . 除非你明确检查输入类型,否则Python的鸭子打字通常是免费的 . 除非绝对不可避免,否则不要这样做 .
对于您生成的数据(输出参数),只需返回对您最方便的数据,例如:返回您保留的任何数据类型或您的帮助函数返回的任何内容 .
要记住的一件事是避免返回属于您所在州的列表(或任何其他可变的列表),例如:
列表相对于元组的一个次要但值得注意的优点是列表往往更容易移植 . 标准工具不太可能支持元组 . 例如,JSON没有元组类型 . YAML确实如此,但与其列表语法相比,它的语法很难看,这非常好 .
在这些情况下,您可能希望在内部使用元组,然后转换为列表作为导出过程的一部分 . 或者,您可能希望在任何地方使用列表以保持一致性 .
您需要确定的第一件事是数据结构是否需要是可变的 . 如前所述,列表是可变的,元组不是 . 这也意味着元组可以用于字典键,而列表则不能 .
根据我的经验,元组通常用于秩序和位置有意义且一致的地方 . 例如,在为选择自己的冒险游戏创建数据结构时,我选择使用元组而不是列表,因为元组中的位置是有意义的 . 以下是该数据结构的一个示例:
元组中的第一个位置是用户在玩游戏时显示的选项,第二个位置是选择所在页面的键,这对所有页面都是一致的 .
元组也比列表更有内存效率,但我不确定这种好处何时变得明显 .
另请查看Think Python中列表和元组的章节 .
有's a strong culture of tuples being for heterogeneous collections, similar to what you' d在C中使用
struct
,并且列出了同类集合,类似于你从来没有用其他答案中提到的可变性问题来解决这个问题 . 可变性对它有影响(你实际上不能改变一个元组),而同质性没有强制执行,因此似乎是一个不那么有趣的区别 .