为什么Python的元组没有任何与之相关的方法?例如tuple.append()
,tuple.remove()
等?
如果在访问列表项时访问元组的内容,那么为什么元组没有与列表相关的方法?
答案 0 :(得分:13)
tuple
是不可变的,你不能改变它们的内容。
编辑 - 就问题发表评论,我不确定我的答案是否明确 - 有元组的方法,但不是修改它们的方法。
答案 1 :(得分:6)
元组是不可变的,而列表可以修改。这本身就解释了为什么元组没有任何修改它们的方法,但暗示了另一个问题...... 为什么它们是不可变的?什么是不可改变的清单?为什么不只有一个列表类型? 它归结为几个微妙的设计考虑......
在某种程度上,它提供了一种语义约定:tuple
应该被视为一组n个对象的单个“配对”。通常,这就像SQL数据库中的一行......元组中元素的位置通常具有隐含意义(id,name等),元组元素的类型可能大不相同(这个想法是通过在2.6中引入namedtuple
类来进一步加强。这与list
的正常用法不同,后者通常包含可变数量的元素,所有元素都相同,并且除了排序之外,位置对于元素几乎没有意义。或者,可以将它们视为列表的快照,非常类似于frozenset
vs set
。 (并不是说任何一种方式都以任何方式强制执行 - 只是反对谷物可能会导致你遇到像尝试修改元组一样的问题。)
所以这很好,但实际的好处是什么?首先,由于元组是不可变的,所以一旦创建它们就无法更改。这使您可以将它们用作字典中的键,而列表可能会更改它的内容,因此无法进行哈希处理。
这使得它们更多地被视为对象的匿名配对,等于同一组对象的任何其他相同配对,而列表可能具有隐藏的行为......如果对列表的引用存储在某处,则修改列表可以更改gui中显示的名称列表,或者你有什么。因此,两个列表可以具有相同的内容,但是修改它们可以在整个程序中具有不同的行为。而当你传递一个元组时,你知道它不可能从你身下被修改出来......这个特殊的选择已经完成了。因此,不必修改元组,而是必须创建一个新的元组。
我认为我没有抓住所有的用例,如果你还没有完全得到预期的用例,也不要担心......这两个类的意图差异是微妙的,但是功能强大,可能需要在点击之前进行一些游戏。