python用list存放tuple_python:list vs tuple,何时使用?

python:list vs tuple,何时使用?

这个问题在这里已有答案:

列表和元组之间有什么区别?                                     18个答案

在Python中,何时应该使用列表和何时使用元组?

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

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

然后x必须是一个元组。

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

7个解决方案

570 votes

元组本质上是固定大小的,而列表是动态的。

换句话说,in是不可变的,而list是可变的。

您无法将元素添加到元组。 元组没有追加或扩展方法。

您无法从元组中删除元素。 元组没有删除或弹出方法。

您可以在元组中找到元素,因为这不会更改元组。

您还可以使用in运算符来检查元组中是否存在元素。

元组比列表更快。 如果你要定义一组常量值,那么你将要做的就是迭代它,使用元组而不是列表。

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

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

资料来源:深入研究Python 3

jldupont answered 2019-01-26T22:29:15Z

195 votes

有一个强大的元组文化用于异构集合,类似于你在C中使用的structs,并列出了同类集合,类似于你使用数组的集合。 但我从来没有像其他答案中提到的可变性问题那样对此进行平衡。 可变性对它有影响(你实际上不能改变一个元组),而同质性没有强制执行,因此似乎是一个不那么有趣的区别。

Ned Batchelder answered 2019-01-26T22:27:54Z

75 votes

我相信(我并不精通Python),主要区别在于元组是不可变的(在赋值后它不能改变)并且列表是可变的(你可以追加,改变,减去等等))。

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

thornomad answered 2019-01-26T22:29:44Z

35 votes

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

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

对于异构对象的集合(如地址分为名称,街道,城市,州和邮编),我更喜欢使用元组。 它们总是可以轻松升级为命名元组。

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

AFoglia answered 2019-01-26T22:30:27Z

11 votes

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

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

pages = {'foyer': {'text' : "some text",

'choices' : [('open the door', 'rainbow'),

('go left into the kitchen', 'bottomless pit'),

('stay put','foyer2')]},}

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

元组也比列表更有内存效率,但我不确定这种好处何时变得明显。

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

Amanda Nyren answered 2019-01-26T22:31:17Z

10 votes

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

对于输入参数,最好接受最符合您需求的通用接口。 它很少只是一个元组或列表 - 更常见的是序列,可切片甚至可迭代。 除非你明确检查输入类型,否则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

Rafał Dowgird answered 2019-01-26T22:31:56Z

2 votes

列表相对于元组的一个小但显着的优点是列表往往更容易移植。 标准工具不太可能支持元组。 例如,JSON没有元组类型。 YAML确实如此,但与其列表语法相比,它的语法很难看,这非常好。

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

Doug F answered 2019-01-26T22:32:27Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值