在Python中,我所知道的列表和元组之间的唯一区别是“列表是可变的,但元组不是”。但据我所知,这取决于编码人员是否愿意冒险变异。
所以我想知道是否有必要在列表上使用元组的情况。使用列表无法完成的事情可以通过元组完成吗?
答案 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'