Python中列表和元组有什么区别?
哪个更有效率呢?它们各自通常用来做什么?
4 个回答
列表是可变的,也就是说你可以随意修改它们的内容;而元组是不可变的,修改它们的内容是不可能的。通常来说,简单来说就是:当你需要改变某些值的时候,就用列表。而元组因为不能被改变,所以在某些情况下会稍微高效一点(当然,如果你像使用列表那样频繁地复制元组,那就另当别论了)。
列表是可变的,你可以往里面添加元素。而元组则是不可变的,这意味着它在某些情况下会更高效。元组还可以哈希化,所以可以用来当字典中的键。
可以看看这个链接。
列表是一种可变的序列,拥有很多方法(包括可以改变内容的方法和不改变内容的方法),通常用作通用容器(列表里的元素可以是任何类型的对象,虽然通常建议列表中的元素类型保持一致,这样使用起来更方便)。
元组是一种不可变的序列,方法很少(都是不改变内容的特殊方法),通常在你需要保持不变性时使用,比如把它作为集合中的一个项目或字典中的一个键(不过这些元素也必须是不可变的,比如字符串、数字或其他嵌套的元组,这样才能正常工作)。元组里的元素可以是任何类型的对象,元组中有不同类型的元素是很正常的。
在一些情况下,元组和列表都可以使用,这时元组因为体积小、构建速度快,可能会更受欢迎。例如,当一个函数需要返回多个结果时,通常会使用
return fee, fie, foo, fum
也就是说,返回一个包含四个项目的元组,而不是
return [fee, fie, foo, fum]
也就是说,返回一个包含四个项目的列表——除了性能上的小提升,"返回一个元组"的常用说法也解决了一个问题,那就是返回的多个结果通常不是同一种或可以互换的类型,因此从风格上讲,使用列表可能不太合适。
一个有用的元组变体是它的子类型 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
创建的命名元组子类与直接使用元组相比,几乎没有额外的开销,或者说,
它们轻量且所需内存与普通元组相同。