必须使用元组的情况

时间:2012-07-09 16:12:16

标签: python list tuples

在Python中,我所知道的列表和元组之间的唯一区别是“列表是可变的,但元组不是”。但据我所知,这取决于编码人员是否愿意冒险变异。

所以我想知道是否有必要在列表上使用元组的情况。使用列表无法完成的事情可以通过元组完成吗?

3 个答案:

答案 0 :(得分:30)

您可以使用元组作为词典中的键,并将元组插入集合中:

>>> {}[tuple()] = 1
>>> {}[list()] = 1 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

这基本上是tuple可以播放的结果,list不是:

>>> hash(list())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple())
3527539

答案 1 :(得分:13)

@Otto的回答非常好。我唯一需要补充的是,当你打开第三方扩展时,你真的需要查阅文档。某些函数/方法可能需要一种或另一种数据类型(或根据您使用的数据类型而具有不同的结果)。一个例子是使用元组/列表来索引numpy数组:

import numpy as np
a=np.arange(50)
a[[1,4,8]] #array([1, 4, 8])
a[(1,4,8)] #IndexError

修改

此外,快速计时测试表明,元组创建比列表创建快得多:

import timeit
t=timeit.timeit('[1,2,3]',number=10000000)
print (t)
t=timeit.timeit('(1,2,3)',number=10000000)
print (t)

这是很好的记住。换句话说,做:

for num in (8, 15, 200):
    pass

而不是:

for num in [8, 15, 200]:
    pass

答案 2 :(得分:4)

此外,使用%运算符的现在过时的字符串格式要求参数列表是元组。列表将被视为单个参数:

>>> "%s + %s" % [1, 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> "%s + %s" % (1, 2)
'1 + 2'