除了元组是不变的之外,还有一个语义上的区别应该指导它们的使用.元组是异构数据 struct (即,它们的条目具有不同的含义),而列表是同质序列.Tuples have structure, lists have order.
使用这一区别可以使代码更明确、更易于理解.
一个例子是一本书中参考位置的页码和行号对,例如:
my_location = (42, 11) # page number, line number
然后,您可以将其用作字典中的键,以存储有关位置的注释.另一方面,列表可用于存储多个位置.当然,人们可能想在列表中添加或删除位置,所以列表是可变的是有道理的.另一方面,从现有位置添加或删除项是没有意义的,因此元组是不可变的.
在某些情况下,您可能希望更改现有位置元组中的项,例如在遍历页面的行时.但元组不变性迫使您 for each 新值创建一个新的位置元组.从表面上看,这似乎不太方便,但像这样使用不可变数据是值类型和函数式编程技术的基石,它们可能具有实质性的优势.
关于这个问题有一些有趣的文章,例如"Python Tuples are Not Just Constant Lists"或"Understanding tuples vs. lists in Python".官方Python文档also mentions this
"元组是不可变的,通常包含异构序列……".
在静态类型语言(如Haskell)中,元组中的值通常有不同的类型,元组的长度必须固定.在列表中,所有值都具有相同的类型,且长度不固定.所以差别非常明显.
最后是Python中的namedtuple,这很有意义,因为元组应该已经有了 struct .这突显了元组是类和实例的轻量级替代品的 idea .