Python中的列表和元组有什么区别?

ban*_*anx 7 python tuples list

哪个更有效率?每种的典型用途是什么?

Ale*_*lli 7

列表是可变序列,有许多方法(包括变异和非变异的方法),它们通常用作通用容器(它们的项目可以是任何类型的对象,尽管它有时被认为是更好的列表样式具有相同类型或类型的项目等效使用).

元组是不可变的序列,只有很少的方法(所有非变异的特殊元素),当你需要不可变性以便将容器用作集合中的项目或字典中的键时(通过项目),最常使用这些方法也必须是不可变的 - 例如字符串,数字或其他嵌套元组,为此起作用).他们的项目可以是任何类型的对象,元组拥有许多不同类型的项目是完全正常的.

在一些情况下,元组或列表也可以同样起作用,并且在少数情况下,元组更小且构建更快的事实可用于影响有利于元组的决策.例如,当函数需要返回多个结果时,使用它是最正常的

return fee, fie, foo, fum
Run Code Online (Sandbox Code Playgroud)

即,返回一个有问题的四个项目的元组,而不是

return [fee, fie, foo, fum]
Run Code Online (Sandbox Code Playgroud)

也就是说,返回一个包含四个项目的列表 - 除了(小的收益)性能,"返回一个元组"常见的习惯用法也处理通常返回的多个结果不是相同的也不可互换的类型的问题,因此,从风格上讲,无论如何,使用列表可能被认为是一个更可疑的选择.

一个有用的变体tuple是它的子类型collections.namedtuple(需要Python 2.6或更高版本),它允许您按名称(使用属性语法)和索引(正常方式)访问项目.例如,如果import collections位于模块的顶部,则上述return语句可能会变为......

freturn = collections.namedtuple('freturn', 'fee fie foo fum')

def f():
  ...
return freturn(fee, fie, foo, fum)
Run Code Online (Sandbox Code Playgroud)

现在,调用者f()可以像以前一样使用其返回值作为元组,但是会获得很好的替代方案,例如...:

r = f()
print r.fie
Run Code Online (Sandbox Code Playgroud)

代替不那么立即清晰可读

print r[1]
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,collections.namedtuple与直接使用元组相比,使用的命名元组子类基本上没有额外的开销,或者,正如文档所说,

它们很轻巧,不需要比常规元组更多的内存.


Kat*_*iel 6

列表是可变的,您可以向其中添加元素.元组不是,这意味着它(稍微)更高效.元组也是可以清除的,因此可以用作例如字典中的键.

这个.