列表是可变序列,有许多方法(包括变异和非变异方法),最常用作通用容器(它们的项目可以是任何类型的对象,尽管它有时被认为是更好的列表样式具有相同类型或类型的项目等效使用).
元组是不可变的序列,只有很少的方法(所有非变异的特殊元素),当你需要不变性以便将容器用作集合中的项目或字典中的键时(通过项目),最常使用这些方法也必须是不可变的 – 例如字符串,数字或其他嵌套元组,为此起作用).他们的项目可以是任何类型的对象,元组拥有许多不同类型的项目是完全正常的.
在少数几种情况下,元组或列表也可以发挥作用,在少数情况下,元组更小,构建速度更快的事实可以用来影响有利于元组的决策.例如,当函数需要返回多个结果时,使用它是最正常的
return fee, fie, foo, fum
即返回一个包含有问题的四个项目的元组,而不是
return [fee, fie, foo, fum]
也就是说,返回一个包含四个项目的列表 – 除了(小的收益)性能,“返回一个元组”常用的习惯用法也处理通常返回的多个结果不是相同或不可互换的类型的问题,因此,从风格上讲,无论如何,使用列表可能被认为是一个更可疑的选择.
元组的一个有用变体是它的子类型collections.namedtuple(需要Python 2.6或更高版本),它允许您按名称(使用属性语法)和索引(正常方式)访问项目.例如,如果导入集合位于模块顶部,则上述return语句可能会变为……
freturn = collections.namedtuple('freturn', 'fee fie foo fum')
def f():
...
return freturn(fee, fie, foo, fum)
现在,f()的调用者可以像以前一样使用它的返回值作为元组,但是会得到很好的替代品,例如…:
r = f()
print r.fie
代替不那么立即清晰可读
print r[1]
值得注意的是,与直接使用元组相比,使用collections.namedtuple创建的命名元组子类基本上没有额外开销,或者,正如文档所说,
they are lightweight and require no more memory than regular tuples.