为什么Python的元组没有任何方法?

时间:2011-08-14 15:34:34

标签: python tuples

为什么Python的元组没有任何与之相关的方法?例如tuple.append()tuple.remove()等?

如果在访问列表项时访问元组的内容,那么为什么元组没有与列表相关的方法?

2 个答案:

答案 0 :(得分:13)

tuple是不可变的,你不能改变它们的内容。

编辑 - 就问题发表评论,我不确定我的答案是否明确 - 有元组的方法,但不是修改它们的方法。

答案 1 :(得分:6)

元组是不可变的,而列表可以修改。这本身就解释了为什么元组没有任何修改它们的方法,但暗示了另一个问题...... 为什么它们是不可变的?什么是不可改变的清单?为什么不只有一个列表类型? 它归结为几个微妙的设计考虑......

在某种程度上,它提供了一种语义约定:tuple应该被视为一组n个对象的单个“配对”。通常,这就像SQL数据库中的一行......元组中元素的位置通常具有隐含意义(id,name等),元组元素的类型可能大不相同(这个想法是通过在2.6中引入namedtuple类来进一步加强。这与list的正常用法不同,后者通常包含可变数量的元素,所有元素都相同,并且除了排序之外,位置对于元素几乎没有意义。或者,可以将它们视为列表的快照,非常类似于frozenset vs set。 (并不是说任何一种方式都以任何方式强制执行 - 只是反对谷物可能会导致你遇到像尝试修改元组一样的问题。)

所以这很好,但实际的好处是什么?首先,由于元组是不可变的,所以一旦创建它们就无法更改。这使您可以将它们用作字典中的键,而列表可能会更改它的内容,因此无法进行哈希处理。

这使得它们更多地被视为对象的匿名配对,等于同一组对象的任何其他相同配对,而列表可能具有隐藏的行为......如果对列表的引用存储在某处,则修改列表可以更改gui中显示的名称列表,或者你有什么。因此,两个列表可以具有相同的内容,但是修改它们可以在整个程序中具有不同的行为。而当你传递一个元组时,你知道它不可能从你身下被修改出来......这个特殊的选择已经完成了。因此,不必修改元组,而是必须创建一个新的元组。

我认为我没有抓住所有的用例,如果你还没有完全得到预期的用例,也不要担心......这两个类的意图差异是微妙的,但是功能强大,可能需要在点击之前进行一些游戏。