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

时间:2010-07-28 22:13:58

标签: python list tuples

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

4 个答案:

答案 0 :(得分:7)

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

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

在某些情况下,元组或列表也可以发挥作用,在少数情况下,元组更小,构建速度更快的事实可以用来影响元组的决策。例如,当函数需要返回多个结果时,使用

是最正常的
return fee, fie, foo, fum

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

return [fee, fie, foo, fum]

即,返回一个包含四个项目的列表 - 除了(小的收益)性能之外,“返回一个元组”常见习语还处理通常返回的多个结果不相同或不可互换的类型,因此,从风格上来说,使用列表可能被认为是一个更可疑的选择。

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)

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

r = f()
print r.fie

代替不那么立即清晰易读的

print r[1]

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

  

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

答案 1 :(得分:6)

列表 mutable ,您可以向其中添加元素。元组不是,这意味着它(稍微)更高效。元组也是 hashable ,所以可以用作例如字典中的关键。

阅读this

答案 2 :(得分:3)

列表是可变的(可以更改),元组是不可变的。典型用途:它听起来相当陈腐,但是当您需要更改值时使用列表。由于它们的不变性,元组通常效率更高(除非你像列表一样使用它们并且重复它们......)

答案 3 :(得分:1)

在阅读Python doc. on Built-in types之后,我创建了下表,以显示六个可迭代容器之间的主要区别。

<pre>
Container   Notation     Index [n:m]   Mutable   Hashable
=========   ==========   ===========   =======   ========
String      ' ' or " "    position     Immutable    Yes
Range       range(,,)     position     Immutable    Yes
Tuple       (,)           position     Immutable    Yes
List        [,]           position     Yes          No
Set         {,}           No           Yes          No
Dict        {k:v,k:v}     by key       Yes          No
</pre>

set和dict的搜索速度更快,因为它们是散列而不是排序的,因此与大小无关。元组和列表相同,只不过元组是不可变的,而且方法比列表少,因此它不支持项目分配来更改其内容。但是可以串联两个元组以实现“附加”功能,即t1 += t2

由于仅不可变序列类型支持hash(),因此list,set和dict不能用作dict键。在下面的“ a”是一个dict序列中,可以很容易地看到它,它包含int,float,str,range和tuple的不可变键类型:

>>> a
{range(2, 5, 2): 'range', 3: 15, 4.5: 16, 'llmjxm': 'c', -555: 666, -4.5: -25, (5, 6, 7): 'blue', 'abc3': 215, (1, 2, 3): 'red'}
>>> for item in a.keys():
...     print(item, '\t\t==>>', a[item])
... 
range(2, 5, 2)      ==>> range
3       ==>> 15
4.5         ==>> 16
llmjxm      ==>> c
-555        ==>> 666
-4.5        ==>> -25
(5, 6, 7)       ==>> blue
abc3        ==>> 215
(1, 2, 3)       ==>> red
>>> 

可变类型的键将导致TypeError:

>>> a[{5}] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> a[[5]] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> a[{5:6}] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> a[-555] = 666
>>> 

有关更多详细信息,请参见link1link2